This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Cmd+Option+I.

library(raster)
size_dat=read.table("/Users/stijnhantson/Documents/projects/VIIRS_ros/fire_growth_5days_v4.txt", header=T, row.names=NULL)

size_dat=as.data.frame(size_dat)
size_dat=size_dat[-1,]
size_dat=size_dat[,-1]
colnames(size_dat)=c("firename","year","cause","size1","size2","size3","size4","size5","final_firesize","mean_precip1","mean_precip2","mean_precip3","mean_precip4","mean_precip5","mean_tmax1","mean_tmax2","mean_tmax3","mean_tmax4","mean_tmax5","mean_tmean1","mean_tmean2","mean_tmean3","mean_tmean4","mean_tmean5","mean_vpdmax1","mean_vpdmax2","mean_vpdmax3","mean_vpdmax4","mean_vpdmax5","mean_windspeed1","mean_windspeed2","mean_windspeed3","mean_windspeed4","mean_windspeed5","landcover","ecosystem","biomass","elevation")

size_dat2 <- data.frame(lapply(size_dat, function(x) as.numeric(as.character(x))))
NAs introduced by coercion
size_dat2$human = 0
size_dat2$human[size_dat2$cause !=1 & size_dat2$cause !=14 & size_dat2$cause !=17]=1
size_dat2$human[size_dat2$cause ==1 ]=2

pro1 =size_dat2[which(size_dat2$human == 2 & size_dat2$landcover == 1 ), ]
pro2 =size_dat2[which(size_dat2$human == 1 & size_dat2$landcover == 1 ), ]

t.test(pro1$size1,pro2$size1)

    Welch Two Sample t-test

data:  pro1$size1 and pro2$size1
t = -2.0397, df = 74.381, p-value = 0.04493
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -22.0986230  -0.2593373
sample estimates:
mean of x mean of y 
 3.056385 14.235365 
t.test(pro1$size2,pro2$size2)

    Welch Two Sample t-test

data:  pro1$size2 and pro2$size2
t = -2.758, df = 73.138, p-value = 0.007341
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -32.702045  -5.266208
sample estimates:
mean of x mean of y 
 8.254394 27.238521 
t.test(pro1$size3,pro2$size3)

    Welch Two Sample t-test

data:  pro1$size3 and pro2$size3
t = -2.9002, df = 58.203, p-value = 0.005254
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -51.965993  -9.526741
sample estimates:
mean of x mean of y 
 14.10484  44.85121 
t.test(pro1$size4,pro2$size4)

    Welch Two Sample t-test

data:  pro1$size4 and pro2$size4
t = -3.1797, df = 53.078, p-value = 0.002461
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -74.99798 -16.98040
sample estimates:
mean of x mean of y 
 17.68430  63.67349 
t.test(pro1$size5,pro2$size5)

    Welch Two Sample t-test

data:  pro1$size5 and pro2$size5
t = -3.4218, df = 39.443, p-value = 0.001462
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -117.71273  -30.26844
sample estimates:
mean of x mean of y 
 19.71795  93.70853 
pro =size_dat2[which(size_dat2$human == 1 & size_dat2$landcover == 1), ]
length(pro$year)
[1] 68
boxplot(pro$size1,pro$size2,pro$size3,pro$size4,pro$size5,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,500), cex.lab=1.4,cex.axis = 1.3)


pro =size_dat2[which(size_dat2$human == 2 & size_dat2$landcover == 1), ]
length(pro$year)
[1] 77
boxplot(pro$size1,pro$size2,pro$size3,pro$size4,pro$size5,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,500), cex.lab=1.4,cex.axis = 1.3)


pro =size_dat2[which(size_dat2$human == 1 & size_dat2$landcover == 2), ]
length(pro$year)
[1] 18
boxplot(pro$size1,pro$size2,pro$size3,pro$size4,pro$size5,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,500), cex.lab=1.4,cex.axis = 1.3)


pro =size_dat2[which(size_dat2$human == 2 & size_dat2$landcover == 2), ]
length(pro$year)
[1] 9
boxplot(pro$size1,pro$size2,pro$size3,pro$size4,pro$size5,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,500), cex.lab=1.4,cex.axis = 1.3)

length(!is.na(pro$size5))
[1] 9
pro =size_dat2[which(size_dat2$human == 1 & size_dat2$ecosystem == 6), ]
length(pro$year)
[1] 41
boxplot(pro$size1,pro$size2,pro$size3,pro$size4,pro$size5,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,500), cex.lab=1.4,cex.axis = 1.3)


pro =size_dat2[which(size_dat2$human == 2& size_dat2$ecosystem == 6), ]
length(pro$year)
[1] 79
boxplot(pro$size1,pro$size2,pro$size3,pro$size4,pro$size5,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,500), cex.lab=1.4,cex.axis = 1.3)

NA
NA

plot fire size map QGIS

library(data.table)
DT= data.table(res)
fire_size = DT[ , .SD[which.min(growth_km)], by = firename]

fire_size = fire_size[,c()]
spread_list =list.files(viirs_dir, pattern = "_daily.shp$", recursive = TRUE, full.names=T)
i=1
 l=shapefile(spread_list[i])
for (i in 2:length(spread_list)){
  p=shapefile(spread_list[i])
  l <- rbind(l, p, makeUniqueIDs = TRUE) 
}
 l$human = 0
l$human[l$cause !=1 & l$cause !=14 & l$cause !=17]=1
l$human[l$cause ==1 ]=2

     writeOGR(l, "/Users/stijnhantson/Documents/projects/VIIRS_ros/", layer= "all_fires", driver="ESRI Shapefile", overwrite_layer = T)
extract number and size statistics from frap
library(raster)
Loading required package: sp
dr =shapefile("/Users/stijnhantson/Documents/projects/VIIRS_ros/frap_subset.shp")
dr1 =shapefile("/Users/stijnhantson/Documents/data/FRAP/fire18_1.shp")
dr1$YEAR_=as.numeric(as.character(dr1$YEAR_))
dr1$Shape_Area=as.numeric(as.character(dr1$Shape_Area))
dr1=dr1[!is.na(dr1$YEAR_), ]
dr1=dr1[dr1$YEAR_>2011,]
sum(dr1$Shape_Area)
[1] 25651974971
sum(dr$Shape_Area)
[1] 22801510990
  1. frap
  2. only fire growth datasets

daily_res=read.table("/Users/stijnhantson/Documents/projects/VIIRS_ros/final_dataset_V3.txt",header=T)

res=as.data.frame(daily_res)

res$mean_ros =as.numeric(as.character(res$mean_ros))
res$max_ros =as.numeric(as.character(res$max_ros))
res$median95_ros =as.numeric(as.character(res$median95_ros))
res$bi =as.numeric(as.character(res$bi))
res$erc =as.numeric(as.character(res$erc))
res$etr =as.numeric(as.character(res$etr))
res$fm100 =as.numeric(as.character(res$fm100))
res$fm1000 =as.numeric(as.character(res$fm1000))
res$pet =as.numeric(as.character(res$pet))
res$pr =as.numeric(as.character(res$pr))
res$rmax =as.numeric(as.character(res$rmax))
res$rmin =as.numeric(as.character(res$rmin))
res$th =as.numeric(as.character(res$th))
res$tmmn =as.numeric(as.character(res$tmmn))
res$tmmx =as.numeric(as.character(res$tmmx))
res$vpd =as.numeric(as.character(res$vpd))
#res$ws =as.numeric(as.character(res$ws))
res$vs =as.numeric(as.character(res$vs))
res$growth =as.numeric(as.character(res$growth))
res$total_area =as.numeric(as.character(res$total_area))
res$mean_frp =as.numeric(as.character(res$mean_frp))
res$frp_95 =as.numeric(as.character(res$frp_95))
res$max_land =as.numeric(as.character(res$max_land))
res$mean_land =as.numeric(as.character(res$mean_land))
res$biomass =as.numeric(as.character(res$biomass))
res$year =as.numeric(as.character(res$year))
res$month =as.numeric(as.character(res$month))
res$doy_out =as.numeric(as.character(res$doy_out))

res = res[-1,]
res$per_ba = res$growth/res$total_area
res$growth_km =res$growth/1000000

res$human = 0
res$human[res$cause !=1 & res$cause !=14 & res$cause !=17]=1
res$human[res$cause ==1 ]=2

res$ros_km = (res$median95_ros*24)/1000
res$ros_mean_km = (res$mean_ros*24)/1000

plot mean vs max fire rate-of-spread

#summary(res)
plot(res$ros_km,res$ros_mean_km, xlab="maximum fire-spread-rate (km/day",ylab="mean fire-spread-rate (km/day)")


tiff("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/mean_vs_max_ros_v1.tif", width = 5, height = 5, units = 'in', res = 300)
plot(res$ros_km,res$ros_mean_km, xlim=c(0,25),ylim=c(0,10), xlab="maximum fire rate-of-spread (km/day)",ylab="mean fire rate-of-spread (km/day)", cex.lab=1.3,cex.axis = 1.25)
dev.off()
quartz_off_screen 
                2 

difference between human and lightnign fires

me=0
me1=0
days = c("day1","day2","day3","day4","day5")
days1 = c("1","2","3","4","5")
pro1 = res[res$fire_day == 1 & res$human == 1,]
pro2 = res[res$fire_day == 2 & res$human == 1,]
pro3 = res[res$fire_day == 3 & res$human == 1,]
pro4 = res[res$fire_day == 4 & res$human == 1,]
pro5 = res[res$fire_day == 5 & res$human == 1,]
me[1] =mean(pro1$growth_km,na.omit=T)
me[2] =mean(pro2$growth_km,na.omit=T)
me[3] =mean(pro3$growth_km,na.omit=T)
me[4] =mean(pro4$growth_km,na.omit=T)
me[5] =mean(pro5$growth_km,na.omit=T)

pro1h = res[res$fire_day == 1 & res$human == 2,]
pro2h = res[res$fire_day == 2 & res$human == 2,]
pro3h = res[res$fire_day == 3 & res$human == 2,]
pro4h = res[res$fire_day == 4 & res$human == 2,]
pro5h = res[res$fire_day == 5 & res$human == 2,]
me1[1] =mean(pro1h$growth_km,na.omit=T)
me1[2] =mean(pro2h$growth_km,na.omit=T)
me1[3] =mean(pro3h$growth_km,na.omit=T)
me1[4] =mean(pro4h$growth_km,na.omit=T)
me1[5] =mean(pro5h$growth_km,na.omit=T)

boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,250), cex.lab=1.4,cex.axis = 1.3)


boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,250), cex.lab=1.4,cex.axis = 1.3)

tiff("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/figure1_v1.tif", width = 10, height = 5, units = 'in', res = 300)
par(mfrow=c(1,2))
par(mar=c(4, 4, 1,0.1))
par(mgp=c(2.3,1,0))
boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("1","2","3","4","5"),xlab="Day since fire start",ylab= expression('Fire size (km'^-1*')'),ylim=c(0,200), cex.lab=1.4,cex.axis = 1.3)
boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("1","2","3","4","5"),xlab="Day since fire start",ylab= "",ylim=c(0,200), cex.lab=1.4,cex.axis = 1.3)
dev.off()
quartz_off_screen 
                2 
tiff("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_figure1_v1.tif", width = 10, height = 5, units = 'in', res = 300)
par(mfrow=c(1,2))
par(mar=c(4, 4, 1,0.1))
par(mgp=c(2.3,1,0))
boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("1","2","3","4","5"),xlab="Day since fire start",ylab= expression('Fire size (km'^-1*')'),ylim=c(0,700), cex.lab=1.4,cex.axis = 1.3)
boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("1","2","3","4","5"),xlab="Day since fire start",ylab= "",ylim=c(0,700), cex.lab=1.4,cex.axis = 1.3)
dev.off() 
quartz_off_screen 
                2 
pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig4/all.pdf", width = 4, height = 5)
par(mgp=c(2.3,1,0))  
plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days1)
points(me1,type="o",lty = 2, lwd = 2)
dev.off() 
quartz_off_screen 
                2 

t.test(log(pro1$growth_km),log(pro1h$growth_km))

    Welch Two Sample t-test

data:  log(pro1$growth_km) and log(pro1h$growth_km)
t = 6.5083, df = 169.36, p-value = 8.265e-10
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 1.492386 2.791866
sample estimates:
 mean of x  mean of y 
 1.3226886 -0.8194377 
t.test(log(pro2$growth_km),log(pro2h$growth_km))

    Welch Two Sample t-test

data:  log(pro2$growth_km) and log(pro2h$growth_km)
t = 6.9843, df = 134.4, p-value = 1.199e-10
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 1.369607 2.451706
sample estimates:
mean of x mean of y 
2.7559564 0.8453003 
t.test(log(pro3$growth_km),log(pro3h$growth_km))

    Welch Two Sample t-test

data:  log(pro3$growth_km) and log(pro3h$growth_km)
t = 5.3694, df = 137.17, p-value = 3.286e-07
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.9293526 2.0129234
sample estimates:
mean of x mean of y 
 3.186372  1.715234 
t.test(log(pro4$growth_km),log(pro4h$growth_km))

    Welch Two Sample t-test

data:  log(pro4$growth_km) and log(pro4h$growth_km)
t = 4.6217, df = 122.92, p-value = 9.467e-06
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.6909157 1.7261008
sample estimates:
mean of x mean of y 
 3.513204  2.304696 
t.test(log(pro5$growth_km),log(pro5h$growth_km))

    Welch Two Sample t-test

data:  log(pro5$growth_km) and log(pro5h$growth_km)
t = 4.9328, df = 103.98, p-value = 3.089e-06
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.9170094 2.1499736
sample estimates:
mean of x mean of y 
 3.895266  2.361774 

##################3 for western cordillera ecoregion ##################

me=0
me1=0
pro1 = res[res$fire_day == 1 & res$human == 1 & (res$eco1 == 6 | res$eco1 == 7),]
pro2 = res[res$fire_day == 2 & res$human == 1 & (res$eco1 == 6 | res$eco1 == 7),]
pro3 = res[res$fire_day == 3 & res$human == 1 & (res$eco1 == 6 | res$eco1 == 7),]
pro4 = res[res$fire_day == 4 & res$human == 1 & (res$eco1 == 6 | res$eco1 == 7),]
pro5 = res[res$fire_day == 5 & res$human == 1 & (res$eco1 == 6 | res$eco1 == 7),]

boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,250), cex.lab=1.4,cex.axis = 1.3)


pro1h = res[res$fire_day == 1 & res$human == 2 & (res$eco1 == 6 | res$eco1 == 7),]
pro2h = res[res$fire_day == 2 & res$human == 2 & (res$eco1 == 6 | res$eco1 == 7),]
pro3h = res[res$fire_day == 3 & res$human == 2 & (res$eco1 == 6 | res$eco1 == 7),]
pro4h = res[res$fire_day == 4 & res$human == 2 & (res$eco1 == 6 | res$eco1 == 7),]
pro5h = res[res$fire_day == 5 & res$human == 2 & (res$eco1 == 6 | res$eco1 == 7),]

boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,250), cex.lab=1.4,cex.axis = 1.3)

me[1] =mean(pro1$growth_km,na.omit=T)
me[2] =mean(pro2$growth_km,na.omit=T)
me[3] =mean(pro3$growth_km,na.omit=T)
me[4] =mean(pro4$growth_km,na.omit=T)
me[5] =mean(pro5$growth_km,na.omit=T)

me1[1] =mean(pro1h$growth_km,na.rm=T)
me1[2] =mean(pro2h$growth_km,na.rm=T)
me1[3] =mean(pro3h$growth_km,na.rm=T)
me1[4] =mean(pro4h$growth_km,na.rm=T)
me1[5] =mean(pro5h$growth_km,na.rm=T)


par(mgp=c(2.3,1,0))  

plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days)
points(me1,type="o",lty = 2, lwd = 2)

pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig4/north.pdf", width = 4, height = 5)
par(mgp=c(2.3,1,0))  
plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days1)
points(me1,type="o",lty = 2, lwd = 2)
dev.off() 
quartz_off_screen 
                2 

t.test(log(pro1$growth_km),log(pro1h$growth_km))

    Welch Two Sample t-test

data:  log(pro1$growth_km) and log(pro1h$growth_km)
t = 3.2086, df = 69.426, p-value = 0.002019
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.5363985 2.2992588
sample estimates:
 mean of x  mean of y 
 0.4219047 -0.9959240 
t.test(log(pro2$growth_km),log(pro2h$growth_km))

    Welch Two Sample t-test

data:  log(pro2$growth_km) and log(pro2h$growth_km)
t = 4.9267, df = 97.316, p-value = 3.427e-06
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.9938201 2.3346153
sample estimates:
mean of x mean of y 
 2.303104  0.638886 
t.test(log(pro3$growth_km),log(pro3h$growth_km))

    Welch Two Sample t-test

data:  log(pro3$growth_km) and log(pro3h$growth_km)
t = 3.4468, df = 82.843, p-value = 0.0008936
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.4842092 1.8055445
sample estimates:
mean of x mean of y 
 2.695279  1.550402 
t.test(log(pro4$growth_km),log(pro4h$growth_km))

    Welch Two Sample t-test

data:  log(pro4$growth_km) and log(pro4h$growth_km)
t = 3.019, df = 73.938, p-value = 0.003479
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.3104149 1.5156656
sample estimates:
mean of x mean of y 
 3.092997  2.179957 
t.test(log(pro5$growth_km),log(pro5h$growth_km))

    Welch Two Sample t-test

data:  log(pro5$growth_km) and log(pro5h$growth_km)
t = 3.1504, df = 55.57, p-value = 0.002625
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.4138127 1.8597722
sample estimates:
mean of x mean of y 
 3.402659  2.265867 
mean(pro1$growth_km,na.omit=T)
[1] 16.60532
mean(pro1h$growth_km,na.rm=T)
[1] 2.714784

for mediteranean california

pro1 = res[res$fire_day == 1 & res$human == 1 & (res$eco1 == 11),]
pro2 = res[res$fire_day == 2 & res$human == 1 & (res$eco1 == 11),]
pro3 = res[res$fire_day == 3 & res$human == 1 & (res$eco1 == 11),]
pro4 = res[res$fire_day == 4 & res$human == 1 & (res$eco1 == 11),]
pro5 = res[res$fire_day == 5 & res$human == 1 & (res$eco1 == 11),]

boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)


pro1h = res[res$fire_day == 1 & res$human == 2 & (res$eco1 == 11),]
pro2h = res[res$fire_day == 2 & res$human == 2 & (res$eco1 == 11),]
pro3h = res[res$fire_day == 3 & res$human == 2 & (res$eco1 == 11),]
pro4h = res[res$fire_day == 4 & res$human == 2 & (res$eco1 == 11),]
pro5h = res[res$fire_day == 5 & res$human == 2 & (res$eco1 == 11),]

boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)

me[1] =mean(pro1$growth_km,na.omit=T)
me[2] =mean(pro2$growth_km,na.omit=T)
me[3] =mean(pro3$growth_km,na.omit=T)
me[4] =mean(pro4$growth_km,na.omit=T)
me[5] =mean(pro5$growth_km,na.omit=T)

me1[1] =mean(pro1h$growth_km,na.rm=T)
me1[2] =mean(pro2h$growth_km,na.rm=T)
me1[3] =mean(pro3h$growth_km,na.rm=T)
me1[4] =mean(pro4h$growth_km,na.rm=T)
me1[5] =mean(pro5h$growth_km,na.rm=T)


par(mgp=c(2.3,1,0))  

plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days)
points(me1,type="o",lty = 2, lwd = 2)

pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig4/med.pdf", width = 4, height = 5)
par(mgp=c(2.3,1,0))  
plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days1)
points(me1,type="o",lty = 2, lwd = 2)
dev.off() 
quartz_off_screen 
                2 

for difference in autumn

pro1 = res[res$fire_day == 1 & res$human == 1 & res$month >8,]
pro2 = res[res$fire_day == 2 & res$human == 1 & res$month >8,]
pro3 = res[res$fire_day == 3 & res$human == 1 & res$month >8,]
pro4 = res[res$fire_day == 4 & res$human == 1 & res$month >8,]
pro5 = res[res$fire_day == 5 & res$human == 1 & res$month >8,]

boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)


pro1h = res[res$fire_day == 1 & res$human == 2 & res$month >8,]
pro2h = res[res$fire_day == 2 & res$human == 2 & res$month >8,]
pro3h = res[res$fire_day == 3 & res$human == 2 & res$month >8,]
pro4h = res[res$fire_day == 4 & res$human == 2 & res$month >8,]
pro5h = res[res$fire_day == 5 & res$human == 2 & res$month >8,]

boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)

me[1] =mean(pro1$growth_km,na.omit=T)
me[2] =mean(pro2$growth_km,na.omit=T)
me[3] =mean(pro3$growth_km,na.omit=T)
me[4] =mean(pro4$growth_km,na.omit=T)
me[5] =mean(pro5$growth_km,na.omit=T)

me1[1] =mean(pro1h$growth_km,na.rm=T)
me1[2] =mean(pro2h$growth_km,na.rm=T)
me1[3] =mean(pro3h$growth_km,na.rm=T)
me1[4] =mean(pro4h$growth_km,na.rm=T)
me1[5] =mean(pro5h$growth_km,na.rm=T)


par(mgp=c(2.3,1,0))  

plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days)
points(me1,type="o",lty = 2, lwd = 2)

pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig4/autumn.pdf", width = 4, height = 5)
par(mgp=c(2.3,1,0))  
plot(me,type="o", ylim=c(0,250),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days1)
points(me1,type="o",lty = 2, lwd = 2)
dev.off() 
quartz_off_screen 
                2 

for difference in summer

pro1 = res[res$fire_day == 1 & res$human == 1 & res$month <=8 ,]
pro2 = res[res$fire_day == 2 & res$human == 1 & res$month <=8,]
pro3 = res[res$fire_day == 3 & res$human == 1 & res$month <=8,]
pro4 = res[res$fire_day == 4 & res$human == 1 & res$month <=8,]
pro5 = res[res$fire_day == 5 & res$human == 1 & res$month <=8,]

boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)


pro1h = res[res$fire_day == 1 & res$human == 2 & res$month <=8,]
pro2h = res[res$fire_day == 2 & res$human == 2 & res$month <=8,]
pro3h = res[res$fire_day == 3 & res$human == 2 & res$month <=8,]
pro4h = res[res$fire_day == 4 & res$human == 2 & res$month <=8,]
pro5h = res[res$fire_day == 5 & res$human == 2 & res$month <=8,]

boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)

me[1] =mean(pro1$growth_km,na.omit=T)
me[2] =mean(pro2$growth_km,na.omit=T)
me[3] =mean(pro3$growth_km,na.omit=T)
me[4] =mean(pro4$growth_km,na.omit=T)
me[5] =mean(pro5$growth_km,na.omit=T)

me1[1] =mean(pro1h$growth_km,na.rm=T)
me1[2] =mean(pro2h$growth_km,na.rm=T)
me1[3] =mean(pro3h$growth_km,na.rm=T)
me1[4] =mean(pro4h$growth_km,na.rm=T)
me1[5] =mean(pro5h$growth_km,na.rm=T)


par(mgp=c(2.3,1,0))  

plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days)
points(me1,type="o",lty = 2, lwd = 2)

pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig4/summer.pdf", width = 4, height = 5)
par(mgp=c(2.3,1,0))  
plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days1)
points(me1,type="o",lty = 2, lwd = 2)
dev.off() 
quartz_off_screen 
                2 

for difference in summer in western cordillera

pro1 = res[res$fire_day == 1 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro2 = res[res$fire_day == 2 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro3 = res[res$fire_day == 3 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro4 = res[res$fire_day == 4 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro5 = res[res$fire_day == 5 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]

boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)


pro1h = res[res$fire_day == 1 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro2h = res[res$fire_day == 2 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro3h = res[res$fire_day == 3 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro4h = res[res$fire_day == 4 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro5h = res[res$fire_day == 5 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]

boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)

t.test(log(pro1$growth_km),log(pro1h$growth_km))

    Welch Two Sample t-test

data:  log(pro1$growth_km) and log(pro1h$growth_km)
t = 1.3062, df = 51.551, p-value = 0.1973
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.3236595  1.5299715
sample estimates:
 mean of x  mean of y 
-0.1773847 -0.7805406 
t.test(log(pro2$growth_km),log(pro2h$growth_km))

    Welch Two Sample t-test

data:  log(pro2$growth_km) and log(pro2h$growth_km)
t = 3.6535, df = 78.926, p-value = 0.0004639
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.5639969 1.9140943
sample estimates:
mean of x mean of y 
2.0787175 0.8396718 
t.test(log(pro3$growth_km),log(pro3h$growth_km))

    Welch Two Sample t-test

data:  log(pro3$growth_km) and log(pro3h$growth_km)
t = 2.1785, df = 57.055, p-value = 0.03352
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.05727942 1.36024900
sample estimates:
mean of x mean of y 
 2.551723  1.842958 
t.test(log(pro4$growth_km),log(pro4h$growth_km))

    Welch Two Sample t-test

data:  log(pro4$growth_km) and log(pro4h$growth_km)
t = 2.353, df = 57.21, p-value = 0.02208
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.1074894 1.3347908
sample estimates:
mean of x mean of y 
 2.992332  2.271192 
t.test(log(pro5$growth_km),log(pro5h$growth_km))

    Welch Two Sample t-test

data:  log(pro5$growth_km) and log(pro5h$growth_km)
t = 2.3446, df = 41.508, p-value = 0.02391
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.105315 1.410281
sample estimates:
mean of x mean of y 
 3.313679  2.555881 
me[1] =mean(pro1$growth_km,na.omit=T)
me[2] =mean(pro2$growth_km,na.omit=T)
me[3] =mean(pro3$growth_km,na.omit=T)
me[4] =mean(pro4$growth_km,na.omit=T)
me[5] =mean(pro5$growth_km,na.omit=T)

me1[1] =mean(pro1h$growth_km,na.rm=T)
me1[2] =mean(pro2h$growth_km,na.rm=T)
me1[3] =mean(pro3h$growth_km,na.rm=T)
me1[4] =mean(pro4h$growth_km,na.rm=T)
me1[5] =mean(pro5h$growth_km,na.rm=T)

par(mgp=c(2.3,1,0))  

plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days)
points(me1,type="o",lty = 2, lwd = 2)

pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig4/north_summer.pdf", width = 4, height = 5)
par(mgp=c(2.3,1,0))  
plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days1)
points(me1,type="o",lty = 2, lwd = 2)
dev.off() 
quartz_off_screen 
                2 

for difference in autumn in western cordillera

pro1 = res[res$fire_day == 1 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro2 = res[res$fire_day == 2 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro3 = res[res$fire_day == 3 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro4 = res[res$fire_day == 4 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro5 = res[res$fire_day == 5 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]

boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)


pro1h = res[res$fire_day == 1 & res$human == 2 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro2h = res[res$fire_day == 2 & res$human == 2 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro3h = res[res$fire_day == 3 & res$human == 2 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro4h = res[res$fire_day == 4 & res$human == 2 & (res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro5h = res[res$fire_day == 5 & res$human == 2 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]

boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)

me[1] =mean(pro1$growth_km,na.omit=T)
me[2] =mean(pro2$growth_km,na.omit=T)
me[3] =mean(pro3$growth_km,na.omit=T)
me[4] =mean(pro4$growth_km,na.omit=T)
me[5] =mean(pro5$growth_km,na.omit=T)

me1[1] =mean(pro1h$growth_km,na.rm=T)
me1[2] =mean(pro2h$growth_km,na.rm=T)
me1[3] =mean(pro3h$growth_km,na.rm=T)
me1[4] =mean(pro4h$growth_km,na.rm=T)
me1[5] =mean(pro5h$growth_km,na.rm=T)

par(mgp=c(2.3,1,0))  

plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days)
points(me1,type="o",lty = 2, lwd = 2)

pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig4/north_autumn.pdf", width = 4, height = 5)
par(mgp=c(2.3,1,0))  
plot(me,type="o", ylim=c(0,250),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days1)
points(me1,type="o",lty = 2, lwd = 2)
dev.off() 
quartz_off_screen 
                2 

for difference in summer in meditereanean

pro1 = res[res$fire_day == 1 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 11),]
pro2 = res[res$fire_day == 2 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 11),]
pro3 = res[res$fire_day == 3 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 11),]
pro4 = res[res$fire_day == 4 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 11),]
pro5 = res[res$fire_day == 5 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 11),]

boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)


pro1h = res[res$fire_day == 1 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 11),]
pro2h = res[res$fire_day == 2 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 11),]
pro3h = res[res$fire_day == 3 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 11),]
pro4h = res[res$fire_day == 4 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 11),]
pro5h = res[res$fire_day == 5 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 11),]

boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)

#t.test(log(pro1$growth_km),log(pro1h$growth_km))
#t.test(log(pro2$growth_km),log(pro2h$growth_km))
#t.test(log(pro3$growth_km),log(pro3h$growth_km))
#t.test(log(pro4$growth_km),log(pro4h$growth_km))
#t.test(log(pro5$growth_km),log(pro5h$growth_km))

me[1] =mean(pro1$growth_km,na.omit=T)
me[2] =mean(pro2$growth_km,na.omit=T)
me[3] =mean(pro3$growth_km,na.omit=T)
me[4] =mean(pro4$growth_km,na.omit=T)
me[5] =mean(pro5$growth_km,na.omit=T)

me1[1] =mean(pro1h$growth_km,na.rm=T)
me1[2] =mean(pro2h$growth_km,na.rm=T)
me1[3] =mean(pro3h$growth_km,na.rm=T)
me1[4] =mean(pro4h$growth_km,na.rm=T)
me1[5] =mean(pro5h$growth_km,na.rm=T)

par(mgp=c(2.3,1,0))  

plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days)
points(me1,type="o",lty = 2, lwd = 2)

pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig4/med_summer.pdf", width = 4, height = 5)
par(mgp=c(2.3,1,0))  
plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days1)
points(me1,type="o",lty = 2, lwd = 2)
dev.off() 
quartz_off_screen 
                2 

` ################## for difference in autumn in mediteranean ##################

pro1 = res[res$fire_day == 1 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 11),]
pro2 = res[res$fire_day == 2 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 11),]
pro3 = res[res$fire_day == 3 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 11),]
pro4 = res[res$fire_day == 4 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 11),]
pro5 = res[res$fire_day == 5 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 11),]

boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)


pro1h = res[res$fire_day == 1 & res$human == 2 & ( res$month >8 ) & (res$eco1 == 11),]
pro2h = res[res$fire_day == 2 & res$human == 2 & ( res$month >8 ) & (res$eco1 == 11),]
pro3h = res[res$fire_day == 3 & res$human == 2 & ( res$month >8 ) & (res$eco1 == 11),]
pro4h = res[res$fire_day == 4 & res$human == 2 & ( res$month >8 ) & (res$eco1 == 11),]
pro5h = res[res$fire_day == 5 & res$human == 2 & ( res$month >8 ) & (res$eco1 == 11),]

boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)

me[1] =mean(pro1$growth_km,na.omit=T)
me[2] =mean(pro2$growth_km,na.omit=T)
me[3] =mean(pro3$growth_km,na.omit=T)
me[4] =mean(pro4$growth_km,na.omit=T)
me[5] =mean(pro5$growth_km,na.omit=T)

me1[1] =mean(pro1h$growth_km,na.rm=T)
me1[2] =mean(pro2h$growth_km,na.rm=T)
me1[3] =mean(pro3h$growth_km,na.rm=T)
me1[4] =mean(pro4h$growth_km,na.rm=T)
me1[5] =mean(pro5h$growth_km,na.rm=T)

par(mgp=c(2.3,1,0))  

plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days)
points(me1,type="o",lty = 2, lwd = 2)

pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig4/med_autumn.pdf", width = 4, height = 5)
par(mgp=c(2.3,1,0))  
plot(me,type="o", ylim=c(0,400),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days1)
points(me1,type="o",lty = 2, lwd = 2)
dev.off() 
quartz_off_screen 
                2 

how many days does it take to reach 75% burnt area

res75 = res[res$per_ba > 0.75,]
#peak_day = as.data.frame(aggregate(res75$fire_day, by = list(res75$firename,res75$cause), min))
#peak_day=subset(peak_day,x < 55)
#hi = hist(peak_day$x,prob =F, breaks= c(0:54), xlim=c(0,55), ylab="number of fires", xlab="days", cex.lab=1.4,cex.axis=1.3)

out1 = subset(res75,cause == 1 )   #1=lightning; 14=unknown; 7=arson
out2 = subset(res75,cause !=1 & cause != 14 )
peak_day1 = as.data.frame(aggregate(out1$fire_day, by = list(out1$firename), min))
peak_day2 = as.data.frame(aggregate(out2$fire_day, by = list(out2$firename), min))
peak=as.data.frame(aggregate(res75$fire_day, by = list(res75$firename), min))
quantile(peak_day1$x,0.50,type=3) 
50% 
 10 
quantile(peak_day2$x,0.50,type=3) 
50% 
  3 
peak_day1=subset(peak_day1,x < 56)
peak_day2=subset(peak_day2,x < 56)
hist.a =hist(peak_day1$x,breaks =c(0:55),plot=F)
hist.b =hist(peak_day2$x,breaks =c(0:55),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

fr = barplot(fg,xlab="Days after ignition",ylab="Number of fires",cex.lab=1.4,cex.axis = 1.3, xlim=c(1,65), ylim=c(0,30))
axis(1,c(0.7,5.5,11.5,17.5,23.5,29.5,35.5,41.5,47.5,53.5,59.5,65.5),labels=c(1,5,10,15,20,25,30,35,40,45,50,55),cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")

pdf(file="/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/time_to_reach75.pdf",width=7,height=5)
fr = barplot(fg,xlab="Days after ignition",ylab="Number of fires",cex.lab=1.4,cex.axis = 1.3, xlim=c(1,65), ylim=c(0,30))
axis(1,c(0.7,5.5,11.5,17.5,23.5,29.5,35.5,41.5,47.5,53.5,59.5,65.5),labels=c(1,5,10,15,20,25,30,35,40,45,50,55),cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")
dev.off()
quartz_off_screen 
                2 
########  mediteranean  ###########
out1 = subset(res75,cause == 1 & res75$eco1 == 11)   #1=lightning; 14=unknown; 7=arson
out2 = subset(res75,cause !=1 & cause != 14 & res75$eco1 == 11)
peak_day1 = as.data.frame(aggregate(out1$fire_day, by = list(out1$firename), min))
peak_day2 = as.data.frame(aggregate(out2$fire_day, by = list(out2$firename), min))

peak_day1=subset(peak_day1,x < 56)
peak_day2=subset(peak_day2,x < 56)
hist.a =hist(peak_day1$x,breaks =c(0:55),plot=F)
hist.b =hist(peak_day2$x,breaks =c(0:55),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

pdf(file="/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig5_time75/med.pdf",width=7,height=5)
fr = barplot(fg,xlab="Days after ignition",ylab="Number of fires",cex.lab=1.4,cex.axis = 1.3, xlim=c(1,65), ylim=c(0,15))
axis(1,c(0.7,5.5,11.5,17.5,23.5,29.5,35.5,41.5,47.5,53.5,59.5,65.5),labels=c(1,5,10,15,20,25,30,35,40,45,50,55),cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")
dev.off()
quartz_off_screen 
                2 
########  north cal  ###########
out1 = subset(res75,cause == 1  & (res75$eco1 == 6 | res75$eco1 == 7))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res75,cause !=1 & cause != 14  & (res75$eco1 == 6 | res75$eco1 == 7))
peak_day1 = as.data.frame(aggregate(out1$fire_day, by = list(out1$firename), min))
peak_day2 = as.data.frame(aggregate(out2$fire_day, by = list(out2$firename), min))

peak_day1=subset(peak_day1,x < 56)
peak_day2=subset(peak_day2,x < 56)
hist.a =hist(peak_day1$x,breaks =c(0:55),plot=F)
hist.b =hist(peak_day2$x,breaks =c(0:55),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

pdf(file="/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig5_time75/north.pdf",width=7,height=5)
fr = barplot(fg,xlab="Days after ignition",ylab="Number of fires",cex.lab=1.4,cex.axis = 1.3, xlim=c(1,65), ylim=c(0,15))
axis(1,c(0.7,5.5,11.5,17.5,23.5,29.5,35.5,41.5,47.5,53.5,59.5,65.5),labels=c(1,5,10,15,20,25,30,35,40,45,50,55),cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")
dev.off()
quartz_off_screen 
                2 
########  mediteranean  SUMMER ###########
out1 = subset(res75,cause == 1 & res75$eco1 == 11 & ( res75$month <=8 & res75$month >5 ))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res75,cause !=1 & cause != 14 & res75$eco1 == 11 & ( res75$month <=8 & res75$month >5 ))
peak_day1 = as.data.frame(aggregate(out1$fire_day, by = list(out1$firename), min))
peak_day2 = as.data.frame(aggregate(out2$fire_day, by = list(out2$firename), min))

peak_day1=subset(peak_day1,x < 56)
peak_day2=subset(peak_day2,x < 56)
hist.a =hist(peak_day1$x,breaks =c(0:55),plot=F)
hist.b =hist(peak_day2$x,breaks =c(0:55),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

pdf(file="/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig5_time75/med_summer.pdf",width=7,height=5)
fr = barplot(fg,xlab="Days after ignition",ylab="Number of fires",cex.lab=1.4,cex.axis = 1.3, xlim=c(1,65), ylim=c(0,10))
axis(1,c(0.7,5.5,11.5,17.5,23.5,29.5,35.5,41.5,47.5,53.5,59.5,65.5),labels=c(1,5,10,15,20,25,30,35,40,45,50,55),cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")
dev.off()
quartz_off_screen 
                2 
########  north cal  summer ###########
out1 = subset(res75,cause == 1  & (res75$eco1 == 6 | res75$eco1 == 7)& ( res75$month <=8 & res75$month >5 ))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res75,cause !=1 & cause != 14  & (res75$eco1 == 6 | res75$eco1 == 7)& ( res75$month <=8 & res75$month >5 ))
peak_day1 = as.data.frame(aggregate(out1$fire_day, by = list(out1$firename), min))
peak_day2 = as.data.frame(aggregate(out2$fire_day, by = list(out2$firename), min))

peak_day1=subset(peak_day1,x < 56)
peak_day2=subset(peak_day2,x < 56)
hist.a =hist(peak_day1$x,breaks =c(0:55),plot=F)
hist.b =hist(peak_day2$x,breaks =c(0:55),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

pdf(file="/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig5_time75/north_summer.pdf",width=7,height=5)
fr = barplot(fg,xlab="Days after ignition",ylab="Number of fires",cex.lab=1.4,cex.axis = 1.3, xlim=c(1,65), ylim=c(0,12))
axis(1,c(0.7,5.5,11.5,17.5,23.5,29.5,35.5,41.5,47.5,53.5,59.5,65.5),labels=c(1,5,10,15,20,25,30,35,40,45,50,55),cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")
dev.off()
quartz_off_screen 
                2 
########  mediteranean  autumn###########
out1 = subset(res75,cause == 1 & res75$eco1 == 11 & ( res75$month >8))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res75,cause !=1 & cause != 14 & res75$eco1 == 11 & ( res75$month >8 ))
#peak_day1 = as.data.frame(aggregate(out1$fire_day, by = list(out1$firename), min))
peak_day2 = as.data.frame(aggregate(out2$fire_day, by = list(out2$firename), min))

#peak_day1=subset(peak_day1,x < 56)
peak_day2=subset(peak_day2,x < 56)
#hist.a =hist(peak_day1$x,breaks =c(0:55),plot=F)
hist.b =hist(peak_day2$x,breaks =c(0:55),plot=F)
fg = rbind(0,hist.b$counts)

pdf(file="/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig5_time75/med_autumn.pdf",width=7,height=5)
fr = barplot(fg,xlab="Days after ignition",ylab="Number of fires",cex.lab=1.4,cex.axis = 1.3, xlim=c(1,65), ylim=c(0,5))
axis(1,c(0.7,5.5,11.5,17.5,23.5,29.5,35.5,41.5,47.5,53.5,59.5,65.5),labels=c(1,5,10,15,20,25,30,35,40,45,50,55),cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")
dev.off()
quartz_off_screen 
                2 
########  north cal  autumn ###########
out1 = subset(res75,cause == 1  & (res75$eco1 == 6 | res75$eco1 == 7)& ( res75$month >8))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res75,cause !=1 & cause != 14  & (res75$eco1 == 6 | res75$eco1 == 7)& ( res75$month >8 ))
peak_day1 = as.data.frame(aggregate(out1$fire_day, by = list(out1$firename), min))
peak_day2 = as.data.frame(aggregate(out2$fire_day, by = list(out2$firename), min))

peak_day1=subset(peak_day1,x < 56)
peak_day2=subset(peak_day2,x < 56)
hist.a =hist(peak_day1$x,breaks =c(0:55),plot=F)
hist.b =hist(peak_day2$x,breaks =c(0:55),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

pdf(file="/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig5_time75/north_autumn.pdf",width=7,height=5)
fr = barplot(fg,xlab="Days after ignition",ylab="Number of fires",cex.lab=1.4,cex.axis = 1.3, xlim=c(1,65), ylim=c(0,5))
axis(1,c(0.7,5.5,11.5,17.5,23.5,29.5,35.5,41.5,47.5,53.5,59.5,65.5),labels=c(1,5,10,15,20,25,30,35,40,45,50,55),cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")
dev.off()
quartz_off_screen 
                2 


res=res[res$ros_km>0,]
res_f = res[res$max_land == 1,]
res_p = res[res$max_land != 1,]

#just show the plot here
plot(res_f$mean_frp~res_f$ros_km,log="xy",xlim=c(0.005,30),ylim=c(0.1,180),xaxt="n",ylab="mean FRP (MW)",xlab="Rate-of-Spread (km/day)", cex.lab=1.4,cex.axis = 1.3,col="darkgreen")

marks=c(0.01,0.1,1,10)
marks1=c(0.1,0.5,5,50)
tiff("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/fig_FRP_ros_v3.tif", width = 5, height = 5, units = 'in', res = 300)
plot(res_f$mean_frp~res_f$ros_km,log="xy",xlim=c(0.005,30),ylim=c(0.1,180),xaxt="n",yaxt="n",ylab="mean FRP (MW)",xlab="Rate-of-Spread (km/day)", cex.lab=1.4,cex.axis = 1.3,col="darkgreen")
points(res_p$mean_frp~res_p$ros_km,col="orange")
axis(1,at=marks,labels=marks,cex.axis=1.4 )
axis(2,at=marks1,labels=marks1,cex.axis=1.4 )
legend( x="topleft",legend=c("Forest","Grass & shrub"),col=c("darkgreen","orange"),cex=1.2,pch=1,bty = "n")
dev.off()
quartz_off_screen 
                2 

difference in fire size for first 5 days across california and both ecosystems

 
res$ros1 = res$max_ros+1


out1 = subset(res,cause == 1 )   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 )

hum1 = out2[out2$fire_day ==1,]
hum2 = out2[out2$fire_day ==2,]
hum3 = out2[out2$fire_day ==3,]
hum4 = out2[out2$fire_day ==4,]
hum5 = out2[out2$fire_day ==5,]
lig1 = out1[out1$fire_day ==1,]
lig2 = out1[out1$fire_day ==2,]
lig3 = out1[out1$fire_day ==3,]
lig4 = out1[out1$fire_day ==4,]
lig5 = out1[out1$fire_day ==5,]
mean(hum1$growth)
[1] 18753898
mean(hum2$growth)
[1] 36707455
mean(hum3$growth)
[1] 57176147
mean(hum4$growth)
[1] 80694648
mean(hum5$growth)
[1] 115079142
mean(lig1$growth)
[1] 2875395
mean(lig2$growth)
[1] 10065897
mean(lig3$growth)
[1] 18876394
mean(lig4$growth)
[1] 28689523
mean(lig5$growth)
[1] 37533565
t.test(log10(hum1$growth),log10(lig1$growth))

    Welch Two Sample t-test

data:  log10(hum1$growth) and log10(lig1$growth)
t = 6.5083, df = 169.36, p-value = 8.265e-10
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.6481351 1.2124922
sample estimates:
mean of x mean of y 
 6.574436  5.644123 
t.test(log10(hum2$growth),log10(lig2$growth))

    Welch Two Sample t-test

data:  log10(hum2$growth) and log10(lig2$growth)
t = 6.9843, df = 134.4, p-value = 1.199e-10
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.5948126 1.0647622
sample estimates:
mean of x mean of y 
 7.196897  6.367109 
t.test(log10(hum3$growth),log10(lig3$growth))

    Welch Two Sample t-test

data:  log10(hum3$growth) and log10(lig3$growth)
t = 5.3694, df = 137.17, p-value = 3.286e-07
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.4036127 0.8742015
sample estimates:
mean of x mean of y 
 7.383824  6.744917 
t.test(log10(hum4$growth),log10(lig4$growth))

    Welch Two Sample t-test

data:  log10(hum4$growth) and log10(lig4$growth)
t = 4.6217, df = 122.92, p-value = 9.467e-06
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.3000609 0.7496361
sample estimates:
mean of x mean of y 
 7.525765  7.000917 
t.test(log10(hum5$growth),log10(lig5$growth))

    Welch Two Sample t-test

data:  log10(hum5$growth) and log10(lig5$growth)
t = 4.9328, df = 103.98, p-value = 3.089e-06
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.3982521 0.9337217
sample estimates:
mean of x mean of y 
 7.691692  7.025706 
hum1 = out2[out2$fire_day ==1 & out2$eco1==6,]
hum2 = out2[out2$fire_day ==2 & out2$eco1==6,]
hum3 = out2[out2$fire_day ==3 & out2$eco1==6,]
hum4 = out2[out2$fire_day ==4 & out2$eco1==6,]
hum5 = out2[out2$fire_day ==5 & out2$eco1==6,]
lig1 = out1[out1$fire_day ==1 & out1$eco1==6,]
lig2 = out1[out1$fire_day ==2 & out1$eco1==6,]
lig3 = out1[out1$fire_day ==3 & out1$eco1==6,]
lig4 = out1[out1$fire_day ==4 & out1$eco1==6,]
lig5 = out1[out1$fire_day ==5 & out1$eco1==6,]
mean(hum1$growth)
[1] 16605316
mean(hum2$growth)
[1] 30366275
mean(hum3$growth)
[1] 44666667
mean(hum4$growth)
[1] 63374279
mean(hum5$growth)
[1] 85629090
mean(lig1$growth, na.rm=T)
[1] 2747161
mean(lig2$growth, na.rm=T)
[1] 8686182
mean(lig3$growth, na.rm=T)
[1] 15363041
mean(lig4$growth, na.rm=T)
[1] 21997987
mean(lig5$growth, na.rm=T)
[1] 26941885
t.test(log10(hum1$growth),log10(lig1$growth))

    Welch Two Sample t-test

data:  log10(hum1$growth) and log10(lig1$growth)
t = 3.1605, df = 69.967, p-value = 0.002328
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.2244363 0.9921939
sample estimates:
mean of x mean of y 
 6.183231  5.574916 
t.test(log10(hum2$growth),log10(lig2$growth))

    Welch Two Sample t-test

data:  log10(hum2$growth) and log10(lig2$growth)
t = 4.8606, df = 97.58, p-value = 4.473e-06
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.4247076 1.0108416
sample estimates:
mean of x mean of y 
 7.000225  6.282451 
t.test(log10(hum3$growth),log10(lig3$growth))

    Welch Two Sample t-test

data:  log10(hum3$growth) and log10(lig3$growth)
t = 3.4215, df = 83.534, p-value = 0.0009662
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.2080219 0.7855227
sample estimates:
mean of x mean of y 
 7.170545  6.673773 
t.test(log10(hum4$growth),log10(lig4$growth))

    Welch Two Sample t-test

data:  log10(hum4$growth) and log10(lig4$growth)
t = 2.9997, df = 74.706, p-value = 0.00367
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.1331595 0.6597929
sample estimates:
mean of x mean of y 
 7.343272  6.946796 
t.test(log10(hum5$growth),log10(lig5$growth))

    Welch Two Sample t-test

data:  log10(hum5$growth) and log10(lig5$growth)
t = 3.1455, df = 56.335, p-value = 0.002647
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.1801401 0.8117505
sample estimates:
mean of x mean of y 
 7.477756  6.981811 
hum1 = out2[out2$fire_day ==1 & out2$eco1==11,]
hum2 = out2[out2$fire_day ==2 & out2$eco1==11,]
hum3 = out2[out2$fire_day ==3 & out2$eco1==11,]
hum4 = out2[out2$fire_day ==4 & out2$eco1==11,]
hum5 = out2[out2$fire_day ==5 & out2$eco1==11,]
lig1 = out1[out1$fire_day ==1 & out1$eco1==11,]
lig2 = out1[out1$fire_day ==2 & out1$eco1==11,]
lig3 = out1[out1$fire_day ==3 & out1$eco1==11,]
lig4 = out1[out1$fire_day ==4 & out1$eco1==11,]
lig5 = out1[out1$fire_day ==5 & out1$eco1==11,]
mean(hum1$growth)
[1] 21604386
mean(hum2$growth)
[1] 43011405
mean(hum3$growth)
[1] 71836206
mean(hum4$growth)
[1] 110978456
mean(hum5$growth)
[1] 156565228
mean(lig1$growth, na.rm=T)
[1] 12710105
mean(lig2$growth, na.rm=T)
[1] 24454241
mean(lig3$growth, na.rm=T)
[1] 39894008
mean(lig4$growth, na.rm=T)
[1] NaN
mean(lig5$growth, na.rm=T)
[1] NaN
#t.test(log10(hum1$growth),log10(lig1$growth))
#t.test(log10(hum2$growth),log10(lig2$growth))
t.test(log10(hum3$growth),log10(lig3$growth))
Error in t.test.default(log10(hum3$growth), log10(lig3$growth)) : 
  not enough 'y' observations

out1 = subset(res,cause == 1 )   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 )

mean(out1$ros_km,na.rm=T)
[1] 0.8405408
mean(out2$ros_km,na.rm=T)
[1] 1.82709
hist.a =hist(out1$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5,30.5,33.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


out1 = subset(res,cause == 1 & (eco1 == 6 | eco1 == 7))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 & (eco1 == 6 | eco1 == 7))

hist.a =hist(out1$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5,30.5,33.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


out1 = subset(res,cause == 1 & eco1 == 11)   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 & eco1 == 11)

hist.a =hist(out1$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5,30.5,33.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


############ autumn northern california
out1 = subset(res,cause == 1 & (eco1 == 6 | eco1 == 7) & (month > 9))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 & (eco1 == 6 | eco1 == 7) & (month > 9))

hist.a =hist(out1$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5,30.5,33.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


############ autumn mediterean california
out1 = subset(res,cause == 1 & eco1 == 11 & (month > 9))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 & eco1 == 11 & (month > 9))

hist.a =hist(out1$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5,30.5,33.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


############ summer northern california
out1 = subset(res,cause == 1 & (eco1 == 6 | eco1 == 7) & (month > 5 & month<10))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 & (eco1 == 6 | eco1 == 7) & (month > 5 & month<10))

hist.a =hist(out1$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5,30.5,33.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


############ summer mediterean california
out1 = subset(res,cause == 1 & eco1 == 11  & (month > 5 & month<10))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 & eco1 == 11  & (month > 5 & month<10))

hist.a =hist(out1$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5,30.5,33.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


out1 = subset(res,cause == 1 )   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 )

mean(out1$ros_km,na.rm=T)
[1] 0.8405408
mean(out2$ros_km,na.rm=T)
[1] 1.82709
#0,0.25,0.5,1,2,3,5,7,10,20,30
hist.a =hist(out1$ros_km,breaks =c(0,0.5,1,2,3,5,7,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.5,1,2,3,5,7,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)
dens = rbind((hist.a$counts/(sum(hist.a$counts)))*100,(hist.b$counts/(sum(hist.b$counts)))*100)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


fr = barplot(dens, beside=TRUE,xlab=expression('Rate-of-Spread (km d'^-1*')'),ylab="% fire days",ylim=c(0,60),cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")

tiff("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/figure2_freq_v1.tif", width = 6, height = 5, units = 'in', res = 300)
fr = barplot(dens, beside=TRUE,xlab=expression('Rate-of-Spread (km d'^-1*')'),ylab="% fire days",ylim=c(0,60),cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")
dev.off() 
quartz_off_screen 
                2 

############ autumn northern california
out1 = subset(res,cause == 1 & (eco1 == 6 | eco1 == 7) & (month > 9))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 & (eco1 == 6 | eco1 == 7) & (month > 9))

hist.a =hist(out1$ros_km,breaks =c(0,0.5,1,2,3,5,7,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.5,1,2,3,5,7,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)
dens = rbind((hist.a$counts/(sum(hist.a$counts)))*100,(hist.b$counts/(sum(hist.b$counts)))*100)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


fr = barplot(dens, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="% fire days",ylim=c(0,80),cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")

tiff("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/S4_freq_autumn_north_v1.tif", width = 6, height = 5, units = 'in', res = 300)
fr = barplot(dens, beside=TRUE,xlab=expression('Rate-of-Spread (km d'^-1*')'),ylab="% fire days",ylim=c(0,80),cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")
dev.off() 
quartz_off_screen 
                2 

############ autumn mediterean california
out1 = subset(res,cause == 1 & eco1 == 11 & (month > 9))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 & eco1 == 11 & (month > 9))

hist.a =hist(out1$ros_km,breaks =c(0,0.5,1,2,3,5,7,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.5,1,2,3,5,7,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)
dens = rbind((hist.a$counts/(sum(hist.a$counts)))*100,(hist.b$counts/(sum(hist.b$counts)))*100)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


fr = barplot(dens, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="% fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")

tiff("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/S4_freq_autumn_med_v1.tif", width = 6, height = 5, units = 'in', res = 300)
fr = barplot(dens, beside=TRUE,xlab=expression('Rate-of-Spread (km d'^-1*')'),ylab="% fire days",ylim=c(0,25),cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")
dev.off() 
quartz_off_screen 
                2 

############ summer northern california
out1 = subset(res,cause == 1 & (eco1 == 6 | eco1 == 7) & (month > 5 & month<10))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 & (eco1 == 6 | eco1 == 7) & (month > 5 & month<10))

hist.a =hist(out1$ros_km,breaks =c(0,0.5,1,2,3,5,7,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.5,1,2,3,5,7,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)
dens = rbind((hist.a$counts/(sum(hist.a$counts)))*100,(hist.b$counts/(sum(hist.b$counts)))*100)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


fr = barplot(dens, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="% fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")

tiff("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/S4_freq_summer_north_v1.tif", width = 6, height = 5, units = 'in', res = 300)
fr = barplot(dens, beside=TRUE,xlab=expression('Rate-of-Spread (km d'^-1*')'),ylab="% fire days",ylim=c(0,60),cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")
dev.off() 
quartz_off_screen 
                2 

############ summer mediterean california
out1 = subset(res,cause == 1 & eco1 == 11  & (month > 5 & month<10))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 & eco1 == 11  & (month > 5 & month<10))

hist.a =hist(out1$ros_km,breaks =c(0,0.5,1,2,3,5,7,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.5,1,2,3,5,7,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)
dens = rbind((hist.a$counts/(sum(hist.a$counts)))*100,(hist.b$counts/(sum(hist.b$counts)))*100)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


fr = barplot(dens, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="% fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")

tiff("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/S4_freq_summer_med_v1.tif", width = 6, height = 5, units = 'in', res = 300)
fr = barplot(dens, beside=TRUE,xlab=expression('Rate-of-Spread (km d'^-1*')'),ylab="% fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")
dev.off() 
quartz_off_screen 
                2 

20 fastest fires


res1 = res[res$ros_km > 10 & !is.na(res$ros_km),]
length(res1$ros_km)
res1

are ROS the same for light & human under the same conditions

out1 = subset(res,cause == 1 )   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 )

plot(out1$vpd,log(out1$ros_km))
points(out2$vpd,log(out2$ros_km),col="red")

summary(lm(out1$vpd~log(out1$ros_km+1),na.omit=T))
summary(lm(out2$vpd~log(out2$ros_km+1)))

analysis of the first day

load data


daily_res=read.table("/Users/stijnhantson/Documents/projects/VIIRS_ros/all_ignitions_V3.txt",header=T)

res=as.data.frame(daily_res)

res$bi =as.numeric(as.character(res$bi))
res$erc =as.numeric(as.character(res$erc))
res$etr =as.numeric(as.character(res$etr))
res$fm100 =as.numeric(as.character(res$fm100))
res$fm1000 =as.numeric(as.character(res$fm1000))
res$pet =as.numeric(as.character(res$pet))
res$pr =as.numeric(as.character(res$pr))
res$rmax =as.numeric(as.character(res$rmax))
res$rmin =as.numeric(as.character(res$rmin))
res$th =as.numeric(as.character(res$th))
res$tmmn =as.numeric(as.character(res$tmmn))
res$tmmx =as.numeric(as.character(res$tmmx))
res$vpd =as.numeric(as.character(res$vpd))
res$ws =as.numeric(as.character(res$ws))
res$vs =as.numeric(as.character(res$vs))
res$total_area =as.numeric(as.character(res$total_area))
res$max_land =as.numeric(as.character(res$max_land))
res$mean_land =as.numeric(as.character(res$mean_land))

res$biomass =as.numeric(as.character(res$biomass))

res = res[-1,]
res$human[res$cause ==1] =1
res$human[res$cause !=1 & res$cause !=14] =0

analysis


out1 = res[res$cause !=1 & res$cause != 14,] 
out2 = res[res$cause ==1,] 

out1 = subset(res,(eco1 == 6 |eco1 == 7) & res$cause !=1 & res$cause != 14)   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,(eco1 == 6 |eco1 == 7) & res$cause ==1)   #1=lightning; 14=unknown; 7=arson

out1 = subset(res,eco1 == 11& res$cause !=1 & res$cause != 14)
out2 = subset(res,eco1 == 11 & res$cause ==1)

out1 = subset(res,(eco1 == 6 |eco1 == 7) & res$cause !=1 & res$cause != 14 & res$mont > 5 & res$mont < 10 )   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,(eco1 == 6 |eco1 == 7) & res$cause ==1& res$mont > 5 & res$mont < 10)   #1=lightning; 14=unknown; 7=arson

t.test(out1$bi,out2$bi)
t.test(out1$erc,out2$erc)
t.test(out1$etr,out2$etr)
t.test(out1$fm100,out2$fm100)
t.test(out1$fm1000,out2$fm1000)
t.test(out1$pet,out2$pet)
t.test(out1$pr,out2$pr)
t.test(out1$rmax,out2$rmax)
t.test(out1$rmin,out2$rmin)
t.test(out1$th,out2$th)
t.test(out1$tmmn,out2$tmmn)
t.test(out1$tmmx,out2$tmmx)
t.test(out1$vpd,out2$vpd)
t.test(out1$vs,out2$vs)
t.test(out1$ws,out2$ws)
t.test(out1$biomass,out2$biomass)
t.test(out1$mean_land,out2$mean_land)
t.test(log10(out1$total_area),log10(out2$total_area))

ta = table(res$human,res$mont)
ps = barplot(ta, beside=TRUE, ylab="number of fires",xpd=T,xlab= "month", xaxt='n',ylim=c(0,300), axis.lty=1,cex.lab = 1.4,cex.axis = 1.2 )
axis(1,at=c(2,5,8,11,14,17,20,23,26,29,32,35), labels =c(1:12),xlim=c(0,36),xpd=F ,cex.lab = 1.4,cex.axis = 1.3)
legend("topright",c("human","lightning"),fill = c("grey", "black"), bty="n",cex=1.4)
text(1,285,"a)",cex=1.8)
out1 = subset(res,eco1 == 6 |eco1 == 7)   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,eco1 == 11)

ta = table(out1$human,out1$mont)
ps = barplot(ta, beside=TRUE, ylab="number of fires",xpd=T, xaxt='n',xlab= "month", ylim=c(0,200), axis.lty=1,cex.lab = 1.4,cex.axis = 1.2 )
axis(1,at=c(2,5,8,11,14,17,20,23,26,29,32,35), labels =c(1:12),xlim=c(0,36),xpd=F,cex.lab = 1.4,cex.axis = 1.3 )
legend("topright",c("human","lightning"),fill = c("grey", "black"), bty="n",cex=1.4)
text(1,190,"b)",cex=1.8)

ta = table(out2$human,out2$mont)
ps = barplot(ta, beside=TRUE, ylab="number of fires",xpd=T,xaxt='n',xlab= "month", ylim=c(0,200), axis.lty=1,cex.lab = 1.4,cex.axis = 1.2 )
axis(1,at=c(2,5,8,11,14,17,20,23,26,29,32,35), labels =c(1:12),xlim=c(0,36),xpd=F,cex.lab = 1.4,cex.axis = 1.3 )
legend("topright",c("human","lightning"),fill = c("grey", "black"), bty="n",cex=1.4)
text(1,190,"c)",cex=1.8)
data_s=read.table("/Users/stijnhantson/Documents/projects/VIIRS_ros/daily_mean_ros_dNBR_V6.txt",row.names=NULL)
rownames(data_s) <- c()

data_s1 = as.data.frame(data_s[,2:19])


names(data_s1) = c("lon","lat","fire","nr_day","max_land","mean_land","elevation","biomass","mean_ros","ros95","mean_dnbr","dnbr95","mean_rdnbr","rdnbr95","mean_BA_red","BA_red95","cause","size")
length(data_s1$lon)
[1] 2459
data_s1$mean_ros =as.numeric(as.character(data_s1$mean_ros))
data_s1$ros95 =as.numeric(as.character(data_s1$ros95))
data_s1$mean_dnbr =as.numeric(as.character(data_s1$mean_dnbr))
data_s1$dnbr95 =as.numeric(as.character(data_s1$dnbr95))
data_s1$mean_rdnbr =as.numeric(as.character(data_s1$mean_rdnbr))
data_s1$rdnbr95 =as.numeric(as.character(data_s1$rdnbr95))
data_s1$lon =as.numeric(as.character(data_s1$lon))
data_s1$lat =as.numeric(as.character(data_s1$lat))

data_s1$mean_land[is.na(data_s1$mean_land)]=data_s1$max_land[is.na(data_s1$mean_land)] #mean landcover gives NA when only one landcover is present
data_s1$mean_land =as.numeric(as.character(data_s1$mean_land))
data_s1$mean_BA_red =as.numeric(as.character(data_s1$mean_BA_red))
data_s1$BA_red95 =as.numeric(as.character(data_s1$BA_red95))
data_s1$biomass =as.numeric(as.character(data_s1$biomass))
data_s1$elevation =as.numeric(as.character(data_s1$elevation))
data_s1$cause =as.numeric(as.character(data_s1$cause))
data_s1$size =as.numeric(as.character(data_s1$size))

data_s1 = data_s1[data_s1$size > 50000,]
data_s1=na.omit(data_s1)

shape = shapefile("/Users/stijnhantson/Documents/data/veg_california/ca_eco_l3/ca_eco_l3.shp")
pts <- SpatialPoints(data_s1[,c("lon","lat")],P4S.latlon)
shape = spTransform(shape,P4S.latlon)
eco = over(pts, shape)
data_s1$L1CODE = eco$NA_L1CODE
data_s1$L3name = eco$US_L3NAME
data_s1$L1CODE =as.numeric(as.character(data_s1$L1CODE))

#data_s1$log_ros = log10(data_s1$mean_ros)
#data_s1$log_ros95 = log10(data_s1$ros95)
#data_s1 = data_s1[data_s1$mean_ros >0,]
data_s1$human[data_s1$cause !=1 & data_s1$cause !=14 & data_s1$cause !=17]=1
data_s1$human[data_s1$cause ==1 ]=2

data_s1$ros_km = (data_s1$ros95 *24)/1000
data_test = data_s1[data_s1$max_land == 1,]
data_test1 = data_s1[data_s1$L1CODE == 6 |data_s1$L1CODE == 7 ,]
data_test2 = data_s1[data_s1$L1CODE == 11,]

data_test1 = data_s1[data_s1$human == 1 & (data_s1$L1CODE == 6 |data_s1$L1CODE == 7),]
data_test2 = data_s1[data_s1$human == 2 & (data_s1$L1CODE == 6 |data_s1$L1CODE == 7),]

data_test1 = data_s1[data_s1$human == 1 ,]
data_test2 = data_s1[data_s1$human == 2 ,]

data_test1=na.omit(data_test1)
data_test2=na.omit(data_test2)

plot(data_s1$ros_km, data_s1$mean_BA_red,log="x",xlab="Rate-of-Spread (km/day)",ylab="Tree mortality (%)",xlim=c(0.005,30),xaxt="n",cex.axis=1.4 ,cex.lab=1.4,cex=0.8, col="black")
33 x values <= 0 omitted from logarithmic plot
axis(1,at=marks,labels=marks,cex.axis=1.4 )
points(data_test2$ros_km, data_test2$mean_BA_red,cex=0.8, col="darkgrey")
points(data_test1$ros_km, data_test1$mean_BA_red,cex=0.8, col="orange")


marks=c(0.01,0.1,1,10)
tiff("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/fig_basa_ros_all_v3.tif", width = 5, height = 5, units = 'in', res = 300)
plot(data_s1$ros_km, data_s1$mean_BA_red,log="x",xlab="Rate-of-Spread (km/day)",ylab="Tree mortality (%)",xlim=c(0.005,30),xaxt="n",cex.axis=1.4 ,cex.lab=1.4,cex=0.8, col="black")
33 x values <= 0 omitted from logarithmic plot
axis(1,at=marks,labels=marks,cex.axis=1.4 )
points(data_test2$ros_km, data_test2$mean_BA_red,cex=0.8, col="darkgrey")
points(data_test1$ros_km, data_test1$mean_BA_red,cex=0.8, col="orange")
lines(lowess(data_s1$ros_km, data_s1$mean_BA_red, f=0.41),col="black", lwd=3)
lines(lowess(data_test1$ros_km, data_test1$mean_BA_red, f=0.41),col="darkgoldenrod3", lwd=3)
lines(lowess(data_test2$ros_km, data_test2$mean_BA_red, f=0.41),col="gray40", lwd=3)
legend("topleft",legend=c("all","human","lightning"),col = c("black","darkgoldenrod3", "gray40"),lty=1, bty="n",lwd = 3, cex=1)
dev.off()
quartz_off_screen 
                2 
data_test1 = data_s1[data_s1$human == 1 & data_s1$max_land <1.5,]
data_test2 = data_s1[data_s1$human == 2 & data_s1$max_land <1.5,]
data_forest = data_s1[data_s1$max_land <1.5,]
data_test1=na.omit(data_test1)
data_test2=na.omit(data_test2)

data_s2 = data_s1[data_s1$ros_km <10,]
data_forest_10 = data_s2[data_s2$max_land <1.5,]
data_test1_10 = data_s2[data_s2$human == 1 & data_s2$max_land <1.5,]
data_test2_10 = data_s2[data_s2$human == 2 & data_s2$max_land <1.5,]
data_test1_10=na.omit(data_test1_10)
data_test2_10=na.omit(data_test2_10)

marks=c(0.01,0.1,1,10)
tiff("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/fig_basa_ros_forest_v3.tif", width = 5, height = 5, units = 'in', res = 300)
plot(data_forest$ros_km, data_forest$mean_BA_red,log="x",xlab="Rate-of-Spread (km/day)",ylab="Tree mortality (%)",xlim=c(0.005,30),xaxt="n",cex.axis=1.4 ,cex.lab=1.4,cex=0.8, col="black")
30 x values <= 0 omitted from logarithmic plot
axis(1,at=marks,labels=marks,cex.axis=1.4 )
points(data_test2$ros_km, data_test2$mean_BA_red,cex=0.8, col="darkgrey")
points(data_test1$ros_km, data_test1$mean_BA_red,cex=0.8, col="orange")
lines(lowess(data_forest_10$ros_km, data_forest_10$mean_BA_red, f=0.41),col="black", lwd=3)
lines(lowess(data_test1_10$ros_km, data_test1_10$mean_BA_red, f=0.41),col="darkgoldenrod3", lwd=3)
lines(lowess(data_test2_10$ros_km, data_test2_10$mean_BA_red, f=0.41),col="gray40", lwd=3)
legend("topleft",legend=c("all","human","lightning"),col = c("black","darkgoldenrod3", "gray40"),lty=1, bty="n",lwd = 3, cex=1)
dev.off()
quartz_off_screen 
                2 
marks=c(0.01,0.1,1,10)
tiff("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/fig_basa_ros_forest_v4.tif", width = 5, height = 5, units = 'in', res = 300)
plot(data_forest$ros_km, data_forest$mean_BA_red,log="x",xlab="Rate-of-Spread (km/day)",ylab="Tree mortality (%)",xlim=c(0.1,15),xaxt="n",cex.axis=1.4 ,cex.lab=1.4,cex=0.8, col="black")
30 x values <= 0 omitted from logarithmic plot
axis(1,at=marks,labels=marks,cex.axis=1.4 )
points(data_test2$ros_km, data_test2$mean_BA_red,cex=0.8, col="darkgrey")
points(data_test1$ros_km, data_test1$mean_BA_red,cex=0.8, col="orange")
lines(lowess(data_forest_10$ros_km, data_forest_10$mean_BA_red, f=0.41),col="black", lwd=3)
lines(lowess(data_test1_10$ros_km, data_test1_10$mean_BA_red, f=0.41),col="darkgoldenrod3", lwd=3)
lines(lowess(data_test2_10$ros_km, data_test2_10$mean_BA_red, f=0.41),col="gray40", lwd=3)
legend("topleft",legend=c("all","human","lightning"),col = c("black","darkgoldenrod3", "gray40"),lty=1, bty="n",lwd = 3, cex=1)
dev.off()
quartz_off_screen 
                2 

plot(data_forest$ros_km, data_forest$mean_BA_red,log="x",xlab="Rate-of-Spread (km/day)",ylab="Tree mortality (%)",xlim=c(0.1,15),xaxt="n",cex.axis=1.4 ,cex.lab=1.4,cex=0.8, col="black")
30 x values <= 0 omitted from logarithmic plot
axis(1,at=marks,labels=marks,cex.axis=1.4 )
points(data_test2$ros_km, data_test2$mean_BA_red,cex=0.8, col="darkgrey")
points(data_test1$ros_km, data_test1$mean_BA_red,cex=0.8, col="orange")
lines(lowess(data_forest_10$ros_km, data_forest_10$mean_BA_red, f=0.41),col="black", lwd=3)
lines(lowess(data_test1_10$ros_km, data_test1_10$mean_BA_red, f=0.41),col="darkgoldenrod3", lwd=3)
lines(lowess(data_test2_10$ros_km, data_test2_10$mean_BA_red, f=0.41),col="gray40", lwd=3)
legend("topleft",legend=c("all","human","lightning"),col = c("black","darkgoldenrod3", "gray40"),lty=1, bty="n",lwd = 3, cex=1)

NA
NA

data_test = data_s1[data_s1$max_land == 1,]
data_test1 = data_s1[data_s1$L1CODE == 6 |data_s1$L1CODE == 7 ,]
data_test2 = data_s1[data_s1$L1CODE == 11,]

data_test1 = data_s1[data_s1$human == 1 & (data_s1$L1CODE == 6 |data_s1$L1CODE == 7),]
data_test2 = data_s1[data_s1$human == 2 & (data_s1$L1CODE == 6 |data_s1$L1CODE == 7),]

data_test1 = data_s1[data_s1$human == 1 ,]
data_test2 = data_s1[data_s1$human == 2 ,]


fast = data_s1[data_s1$ros_km > 1,]
fast_hum = fast[fast$human == 1,]

sum(fast$size)/sum(data_s1$size)
length(fast$size)/length(data_s1$size)

sum(fast_hum$size, na.rm=T)/sum(fast$size)
length(fast_hum$size)/length(fast$size)


quan = quantile(data_s1$ros_km,0.5)
fast = data_s1[data_s1$ros_km > quan,]
slow = data_s1[data_s1$ros_km < quan,]
fast_hum = fast[fast$human == 1,]

sum(fast$size)/sum(data_s1$size)
length(fast$size)/length(data_s1$size)
sum((data_s1$mean_BA_red*data_s1$size))/(sum(data_s1$size))
mean(data_s1$mean_BA_red)

sum(fast_hum$size, na.rm=T)/sum(fast$size)
length(fast_hum$size)/length(fast$size)
sum((fast$mean_BA_red*fast$size))/(sum(fast$size))
mean(fast$mean_BA_red)
sum((slow$mean_BA_red*slow$size))/(sum(slow$size))
mean(slow$mean_BA_red)

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Cmd+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

```

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgoKQWRkIGEgbmV3IGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqSW5zZXJ0IENodW5rKiBidXR0b24gb24gdGhlIHRvb2xiYXIgb3IgYnkgcHJlc3NpbmcgKkNtZCtPcHRpb24rSSouCgoKCgpgYGB7cn0KbGlicmFyeShyYXN0ZXIpCnNpemVfZGF0PXJlYWQudGFibGUoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL3Byb2plY3RzL1ZJSVJTX3Jvcy9maXJlX2dyb3d0aF81ZGF5c192NC50eHQiLCBoZWFkZXI9VCwgcm93Lm5hbWVzPU5VTEwpCgpzaXplX2RhdD1hcy5kYXRhLmZyYW1lKHNpemVfZGF0KQpzaXplX2RhdD1zaXplX2RhdFstMSxdCnNpemVfZGF0PXNpemVfZGF0WywtMV0KY29sbmFtZXMoc2l6ZV9kYXQpPWMoImZpcmVuYW1lIiwieWVhciIsImNhdXNlIiwic2l6ZTEiLCJzaXplMiIsInNpemUzIiwic2l6ZTQiLCJzaXplNSIsImZpbmFsX2ZpcmVzaXplIiwibWVhbl9wcmVjaXAxIiwibWVhbl9wcmVjaXAyIiwibWVhbl9wcmVjaXAzIiwibWVhbl9wcmVjaXA0IiwibWVhbl9wcmVjaXA1IiwibWVhbl90bWF4MSIsIm1lYW5fdG1heDIiLCJtZWFuX3RtYXgzIiwibWVhbl90bWF4NCIsIm1lYW5fdG1heDUiLCJtZWFuX3RtZWFuMSIsIm1lYW5fdG1lYW4yIiwibWVhbl90bWVhbjMiLCJtZWFuX3RtZWFuNCIsIm1lYW5fdG1lYW41IiwibWVhbl92cGRtYXgxIiwibWVhbl92cGRtYXgyIiwibWVhbl92cGRtYXgzIiwibWVhbl92cGRtYXg0IiwibWVhbl92cGRtYXg1IiwibWVhbl93aW5kc3BlZWQxIiwibWVhbl93aW5kc3BlZWQyIiwibWVhbl93aW5kc3BlZWQzIiwibWVhbl93aW5kc3BlZWQ0IiwibWVhbl93aW5kc3BlZWQ1IiwibGFuZGNvdmVyIiwiZWNvc3lzdGVtIiwiYmlvbWFzcyIsImVsZXZhdGlvbiIpCgpzaXplX2RhdDIgPC0gZGF0YS5mcmFtZShsYXBwbHkoc2l6ZV9kYXQsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHgpKSkpCnNpemVfZGF0MiRodW1hbiA9IDAKc2l6ZV9kYXQyJGh1bWFuW3NpemVfZGF0MiRjYXVzZSAhPTEgJiBzaXplX2RhdDIkY2F1c2UgIT0xNCAmIHNpemVfZGF0MiRjYXVzZSAhPTE3XT0xCnNpemVfZGF0MiRodW1hbltzaXplX2RhdDIkY2F1c2UgPT0xIF09MgoKcHJvMSA9c2l6ZV9kYXQyW3doaWNoKHNpemVfZGF0MiRodW1hbiA9PSAyICYgc2l6ZV9kYXQyJGxhbmRjb3ZlciA9PSAxICksIF0KcHJvMiA9c2l6ZV9kYXQyW3doaWNoKHNpemVfZGF0MiRodW1hbiA9PSAxICYgc2l6ZV9kYXQyJGxhbmRjb3ZlciA9PSAxICksIF0KCnQudGVzdChwcm8xJHNpemUxLHBybzIkc2l6ZTEpCnQudGVzdChwcm8xJHNpemUyLHBybzIkc2l6ZTIpCnQudGVzdChwcm8xJHNpemUzLHBybzIkc2l6ZTMpCnQudGVzdChwcm8xJHNpemU0LHBybzIkc2l6ZTQpCnQudGVzdChwcm8xJHNpemU1LHBybzIkc2l6ZTUpCgoKcHJvID1zaXplX2RhdDJbd2hpY2goc2l6ZV9kYXQyJGh1bWFuID09IDEgJiBzaXplX2RhdDIkbGFuZGNvdmVyID09IDEpLCBdCmxlbmd0aChwcm8keWVhcikKYm94cGxvdChwcm8kc2l6ZTEscHJvJHNpemUyLHBybyRzaXplMyxwcm8kc2l6ZTQscHJvJHNpemU1LG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDUwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKcHJvID1zaXplX2RhdDJbd2hpY2goc2l6ZV9kYXQyJGh1bWFuID09IDIgJiBzaXplX2RhdDIkbGFuZGNvdmVyID09IDEpLCBdCmxlbmd0aChwcm8keWVhcikKYm94cGxvdChwcm8kc2l6ZTEscHJvJHNpemUyLHBybyRzaXplMyxwcm8kc2l6ZTQscHJvJHNpemU1LG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDUwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKcHJvID1zaXplX2RhdDJbd2hpY2goc2l6ZV9kYXQyJGh1bWFuID09IDEgJiBzaXplX2RhdDIkbGFuZGNvdmVyID09IDIpLCBdCmxlbmd0aChwcm8keWVhcikKYm94cGxvdChwcm8kc2l6ZTEscHJvJHNpemUyLHBybyRzaXplMyxwcm8kc2l6ZTQscHJvJHNpemU1LG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDUwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKcHJvID1zaXplX2RhdDJbd2hpY2goc2l6ZV9kYXQyJGh1bWFuID09IDIgJiBzaXplX2RhdDIkbGFuZGNvdmVyID09IDIpLCBdCmxlbmd0aChwcm8keWVhcikKYm94cGxvdChwcm8kc2l6ZTEscHJvJHNpemUyLHBybyRzaXplMyxwcm8kc2l6ZTQscHJvJHNpemU1LG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDUwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpsZW5ndGgoIWlzLm5hKHBybyRzaXplNSkpCgoKCnBybyA9c2l6ZV9kYXQyW3doaWNoKHNpemVfZGF0MiRodW1hbiA9PSAxICYgc2l6ZV9kYXQyJGVjb3N5c3RlbSA9PSA2KSwgXQpsZW5ndGgocHJvJHllYXIpCmJveHBsb3QocHJvJHNpemUxLHBybyRzaXplMixwcm8kc2l6ZTMscHJvJHNpemU0LHBybyRzaXplNSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCw1MDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCnBybyA9c2l6ZV9kYXQyW3doaWNoKHNpemVfZGF0MiRodW1hbiA9PSAyJiBzaXplX2RhdDIkZWNvc3lzdGVtID09IDYpLCBdCmxlbmd0aChwcm8keWVhcikKYm94cGxvdChwcm8kc2l6ZTEscHJvJHNpemUyLHBybyRzaXplMyxwcm8kc2l6ZTQscHJvJHNpemU1LG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDUwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKCmBgYAoKCgoKCiMjIyMjIyMjIyMjIyBwbG90IGZpcmUgc2l6ZSBtYXAgUUdJUyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpgYGB7cn0KbGlicmFyeShkYXRhLnRhYmxlKQpEVD0gZGF0YS50YWJsZShyZXMpCmZpcmVfc2l6ZSA9IERUWyAsIC5TRFt3aGljaC5taW4oZ3Jvd3RoX2ttKV0sIGJ5ID0gZmlyZW5hbWVdCgpmaXJlX3NpemUgPSBmaXJlX3NpemVbLGMoKV0Kc3ByZWFkX2xpc3QgPWxpc3QuZmlsZXModmlpcnNfZGlyLCBwYXR0ZXJuID0gIl9kYWlseS5zaHAkIiwgcmVjdXJzaXZlID0gVFJVRSwgZnVsbC5uYW1lcz1UKQppPTEKIGw9c2hhcGVmaWxlKHNwcmVhZF9saXN0W2ldKQpmb3IgKGkgaW4gMjpsZW5ndGgoc3ByZWFkX2xpc3QpKXsKICBwPXNoYXBlZmlsZShzcHJlYWRfbGlzdFtpXSkKICBsIDwtIHJiaW5kKGwsIHAsIG1ha2VVbmlxdWVJRHMgPSBUUlVFKSAKfQogbCRodW1hbiA9IDAKbCRodW1hbltsJENBVVNFICE9MSAmIGwkQ0FVU0UgIT0xNCAmIGwkQ0FVU0UgIT0xN109MQpsJGh1bWFuW2wkQ0FVU0UgPT0xIF09MgoKICAgICB3cml0ZU9HUihsLCAiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvcHJvamVjdHMvVklJUlNfcm9zLyIsIGxheWVyPSAiYWxsX2ZpcmVzIiwgZHJpdmVyPSJFU1JJIFNoYXBlZmlsZSIsIG92ZXJ3cml0ZV9sYXllciA9IFQpCgpgYGAKCgoKCgojIyMjIyBleHRyYWN0IG51bWJlciBhbmQgc2l6ZSBzdGF0aXN0aWNzIGZyb20gZnJhcCAgICMjIyMjIyMjIyMjIyMjIyMKYGBge3J9CmxpYnJhcnkocmFzdGVyKQoKZHIgPXNoYXBlZmlsZSgiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvcHJvamVjdHMvVklJUlNfcm9zL2ZyYXBfc3Vic2V0LnNocCIpCmRyMSA9c2hhcGVmaWxlKCIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9kYXRhL0ZSQVAvZmlyZTE4XzEuc2hwIikKZHIxJFlFQVJfPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRyMSRZRUFSXykpCmRyMSRTaGFwZV9BcmVhPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRyMSRTaGFwZV9BcmVhKSkKZHIxPWRyMVshaXMubmEoZHIxJFlFQVJfKSwgXQpkcjE9ZHIxW2RyMSRZRUFSXz4yMDExLF0Kc3VtKGRyMSRTaGFwZV9BcmVhKQpzdW0oZHIkU2hhcGVfQXJlYSkKYGBgCjEpIGZyYXAgCjIpIG9ubHkgZmlyZSBncm93dGggZGF0YXNldHMKCi0gcHJlcGFyZSBmaW5hbCBkYXRhc2V0IHRvIG9wZW4KYGBge3J9CgpkYWlseV9yZXM9cmVhZC50YWJsZSgiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvcHJvamVjdHMvVklJUlNfcm9zL2ZpbmFsX2RhdGFzZXRfVjMudHh0IixoZWFkZXI9VCkKCnJlcz1hcy5kYXRhLmZyYW1lKGRhaWx5X3JlcykKCnJlcyRtZWFuX3JvcyA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJG1lYW5fcm9zKSkKcmVzJG1heF9yb3MgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRtYXhfcm9zKSkKcmVzJG1lZGlhbjk1X3JvcyA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJG1lZGlhbjk1X3JvcykpCnJlcyRiaSA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJGJpKSkKcmVzJGVyYyA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJGVyYykpCnJlcyRldHIgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRldHIpKQpyZXMkZm0xMDAgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRmbTEwMCkpCnJlcyRmbTEwMDAgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRmbTEwMDApKQpyZXMkcGV0ID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkcGV0KSkKcmVzJHByID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkcHIpKQpyZXMkcm1heCA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJHJtYXgpKQpyZXMkcm1pbiA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJHJtaW4pKQpyZXMkdGggPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyR0aCkpCnJlcyR0bW1uID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkdG1tbikpCnJlcyR0bW14ID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkdG1teCkpCnJlcyR2cGQgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyR2cGQpKQojcmVzJHdzID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkd3MpKQpyZXMkdnMgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyR2cykpCnJlcyRncm93dGggPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRncm93dGgpKQpyZXMkdG90YWxfYXJlYSA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJHRvdGFsX2FyZWEpKQpyZXMkbWVhbl9mcnAgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRtZWFuX2ZycCkpCnJlcyRmcnBfOTUgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRmcnBfOTUpKQpyZXMkbWF4X2xhbmQgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRtYXhfbGFuZCkpCnJlcyRtZWFuX2xhbmQgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRtZWFuX2xhbmQpKQpyZXMkYmlvbWFzcyA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJGJpb21hc3MpKQpyZXMkeWVhciA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJHllYXIpKQpyZXMkbW9udGggPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRtb250aCkpCnJlcyRkb3lfb3V0ID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkZG95X291dCkpCgpyZXMgPSByZXNbLTEsXQpyZXMkcGVyX2JhID0gcmVzJGdyb3d0aC9yZXMkdG90YWxfYXJlYQpyZXMkZ3Jvd3RoX2ttID1yZXMkZ3Jvd3RoLzEwMDAwMDAKCnJlcyRodW1hbiA9IDAKcmVzJGh1bWFuW3JlcyRjYXVzZSAhPTEgJiByZXMkY2F1c2UgIT0xNCAmIHJlcyRjYXVzZSAhPTE3XT0xCnJlcyRodW1hbltyZXMkY2F1c2UgPT0xIF09MgoKcmVzJHJvc19rbSA9IChyZXMkbWVkaWFuOTVfcm9zKjI0KS8xMDAwCnJlcyRyb3NfbWVhbl9rbSA9IChyZXMkbWVhbl9yb3MqMjQpLzEwMDAKCmBgYAoKIyMjIyMjIyBwbG90IG1lYW4gdnMgbWF4IGZpcmUgcmF0ZS1vZi1zcHJlYWQgIyMjIyMjIyMjIyMjIyMjIyMjCmBgYHtyfQojc3VtbWFyeShyZXMpCnBsb3QocmVzJHJvc19rbSxyZXMkcm9zX21lYW5fa20sIHhsYWI9Im1heGltdW0gZmlyZS1zcHJlYWQtcmF0ZSAoa20vZGF5Iix5bGFiPSJtZWFuIGZpcmUtc3ByZWFkLXJhdGUgKGttL2RheSkiKQoKCnRpZmYoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3MvbWVhbl92c19tYXhfcm9zX3YxLnRpZiIsIHdpZHRoID0gNSwgaGVpZ2h0ID0gNSwgdW5pdHMgPSAnaW4nLCByZXMgPSAzMDApCnBsb3QocmVzJHJvc19rbSxyZXMkcm9zX21lYW5fa20sIHhsaW09YygwLDI1KSx5bGltPWMoMCwxMCksIHhsYWI9Im1heGltdW0gZmlyZSByYXRlLW9mLXNwcmVhZCAoa20vZGF5KSIseWxhYj0ibWVhbiBmaXJlIHJhdGUtb2Ytc3ByZWFkIChrbS9kYXkpIiwgY2V4LmxhYj0xLjMsY2V4LmF4aXMgPSAxLjI1KQpkZXYub2ZmKCkKCmBgYAoKCgojIyMjIyMjIyMjIyMgZGlmZmVyZW5jZSBiZXR3ZWVuIGh1bWFuIGFuZCBsaWdodG5pZ24gZmlyZXMgIyMjIyMjIyMjIyMjIyMjIyMKCmBgYHtyfQptZT0wCm1lMT0wCmRheXMgPSBjKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpCmRheXMxID0gYygiMSIsIjIiLCIzIiwiNCIsIjUiKQpwcm8xID0gcmVzW3JlcyRmaXJlX2RheSA9PSAxICYgcmVzJGh1bWFuID09IDEsXQpwcm8yID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDEsXQpwcm8zID0gcmVzW3JlcyRmaXJlX2RheSA9PSAzICYgcmVzJGh1bWFuID09IDEsXQpwcm80ID0gcmVzW3JlcyRmaXJlX2RheSA9PSA0ICYgcmVzJGh1bWFuID09IDEsXQpwcm81ID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDEsXQptZVsxXSA9bWVhbihwcm8xJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzJdID1tZWFuKHBybzIkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbM10gPW1lYW4ocHJvMyRncm93dGhfa20sbmEub21pdD1UKQptZVs0XSA9bWVhbihwcm80JGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzVdID1tZWFuKHBybzUkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKCnBybzFoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAxICYgcmVzJGh1bWFuID09IDIsXQpwcm8yaCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMiAmIHJlcyRodW1hbiA9PSAyLF0KcHJvM2ggPSByZXNbcmVzJGZpcmVfZGF5ID09IDMgJiByZXMkaHVtYW4gPT0gMixdCnBybzRoID0gcmVzW3JlcyRmaXJlX2RheSA9PSA0ICYgcmVzJGh1bWFuID09IDIsXQpwcm81aCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNSAmIHJlcyRodW1hbiA9PSAyLF0KbWUxWzFdID1tZWFuKHBybzFoJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lMVsyXSA9bWVhbihwcm8yaCRncm93dGhfa20sbmEub21pdD1UKQptZTFbM10gPW1lYW4ocHJvM2gkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWUxWzRdID1tZWFuKHBybzRoJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lMVs1XSA9bWVhbihwcm81aCRncm93dGhfa20sbmEub21pdD1UKQoKYm94cGxvdChwcm8xJGdyb3d0aF9rbSxwcm8yJGdyb3d0aF9rbSxwcm8zJGdyb3d0aF9rbSxwcm80JGdyb3d0aF9rbSxwcm81JGdyb3d0aF9rbSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCwyNTApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCmJveHBsb3QocHJvMWgkZ3Jvd3RoX2ttLHBybzJoJGdyb3d0aF9rbSxwcm8zaCRncm93dGhfa20scHJvNGgkZ3Jvd3RoX2ttLHBybzVoJGdyb3d0aF9rbSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCwyNTApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCnRpZmYoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3MvZmlndXJlMV92MS50aWYiLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA1LCB1bml0cyA9ICdpbicsIHJlcyA9IDMwMCkKcGFyKG1mcm93PWMoMSwyKSkKcGFyKG1hcj1jKDQsIDQsIDEsMC4xKSkKcGFyKG1ncD1jKDIuMywxLDApKQpib3hwbG90KHBybzEkZ3Jvd3RoX2ttLHBybzIkZ3Jvd3RoX2ttLHBybzMkZ3Jvd3RoX2ttLHBybzQkZ3Jvd3RoX2ttLHBybzUkZ3Jvd3RoX2ttLG5hbWVzPWMoIjEiLCIyIiwiMyIsIjQiLCI1IikseGxhYj0iRGF5IHNpbmNlIGZpcmUgc3RhcnQiLHlsYWI9IGV4cHJlc3Npb24oJ0ZpcmUgc2l6ZSAoa20nXi0xKicpJykseWxpbT1jKDAsMjAwKSwgY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCmJveHBsb3QocHJvMWgkZ3Jvd3RoX2ttLHBybzJoJGdyb3d0aF9rbSxwcm8zaCRncm93dGhfa20scHJvNGgkZ3Jvd3RoX2ttLHBybzVoJGdyb3d0aF9rbSxuYW1lcz1jKCIxIiwiMiIsIjMiLCI0IiwiNSIpLHhsYWI9IkRheSBzaW5jZSBmaXJlIHN0YXJ0Iix5bGFiPSAiIix5bGltPWMoMCwyMDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKZGV2Lm9mZigpCgp0aWZmKCIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL3N1cF9maWd1cmUxX3YxLnRpZiIsIHdpZHRoID0gMTAsIGhlaWdodCA9IDUsIHVuaXRzID0gJ2luJywgcmVzID0gMzAwKQpwYXIobWZyb3c9YygxLDIpKQpwYXIobWFyPWMoNCwgNCwgMSwwLjEpKQpwYXIobWdwPWMoMi4zLDEsMCkpCmJveHBsb3QocHJvMSRncm93dGhfa20scHJvMiRncm93dGhfa20scHJvMyRncm93dGhfa20scHJvNCRncm93dGhfa20scHJvNSRncm93dGhfa20sbmFtZXM9YygiMSIsIjIiLCIzIiwiNCIsIjUiKSx4bGFiPSJEYXkgc2luY2UgZmlyZSBzdGFydCIseWxhYj0gZXhwcmVzc2lvbignRmlyZSBzaXplIChrbSdeLTEqJyknKSx5bGltPWMoMCw3MDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKYm94cGxvdChwcm8xaCRncm93dGhfa20scHJvMmgkZ3Jvd3RoX2ttLHBybzNoJGdyb3d0aF9rbSxwcm80aCRncm93dGhfa20scHJvNWgkZ3Jvd3RoX2ttLG5hbWVzPWMoIjEiLCIyIiwiMyIsIjQiLCI1IikseGxhYj0iRGF5IHNpbmNlIGZpcmUgc3RhcnQiLHlsYWI9ICIiLHlsaW09YygwLDcwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpkZXYub2ZmKCkgCgpwZGYoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3Mvc3VwX2ZpZzQvYWxsLnBkZiIsIHdpZHRoID0gNCwgaGVpZ2h0ID0gNSkKcGFyKG1ncD1jKDIuMywxLDApKSAgCnBsb3QobWUsdHlwZT0ibyIsIHlsaW09YygwLDE1MCkseWxhYj1leHByZXNzaW9uKCJmaXJlIHNpemUgKGttIl4yKiIpIikseGxhYj0iIiwgeGF4dD0nbicsIGx0eSA9IDEsIGx3ZCA9IDIsY2V4LmxhYj0xLjIpCmF4aXMoc2lkZT0xLCBhdD1jKDE6NSksbGFiZWxzPWRheXMxKQpwb2ludHMobWUxLHR5cGU9Im8iLGx0eSA9IDIsIGx3ZCA9IDIpCmRldi5vZmYoKSAKCnQudGVzdChsb2cocHJvMSRncm93dGhfa20pLGxvZyhwcm8xaCRncm93dGhfa20pKQp0LnRlc3QobG9nKHBybzIkZ3Jvd3RoX2ttKSxsb2cocHJvMmgkZ3Jvd3RoX2ttKSkKdC50ZXN0KGxvZyhwcm8zJGdyb3d0aF9rbSksbG9nKHBybzNoJGdyb3d0aF9rbSkpCnQudGVzdChsb2cocHJvNCRncm93dGhfa20pLGxvZyhwcm80aCRncm93dGhfa20pKQp0LnRlc3QobG9nKHBybzUkZ3Jvd3RoX2ttKSxsb2cocHJvNWgkZ3Jvd3RoX2ttKSkKCgpgYGAKCiMjIyMjIyMjIyMjIyMjIyMjIzMgZm9yIHdlc3Rlcm4gY29yZGlsbGVyYSBlY29yZWdpb24gICMjIyMjIyMjIyMjIyMjIyMjIwpgYGB7cn0KbWU9MAptZTE9MApwcm8xID0gcmVzW3JlcyRmaXJlX2RheSA9PSAxICYgcmVzJGh1bWFuID09IDEgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KcHJvMiA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMiAmIHJlcyRodW1hbiA9PSAxICYgKHJlcyRlY28xID09IDYgfCByZXMkZWNvMSA9PSA3KSxdCnBybzMgPSByZXNbcmVzJGZpcmVfZGF5ID09IDMgJiByZXMkaHVtYW4gPT0gMSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm80ID0gcmVzW3JlcyRmaXJlX2RheSA9PSA0ICYgcmVzJGh1bWFuID09IDEgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KcHJvNSA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNSAmIHJlcyRodW1hbiA9PSAxICYgKHJlcyRlY28xID09IDYgfCByZXMkZWNvMSA9PSA3KSxdCgpib3hwbG90KHBybzEkZ3Jvd3RoX2ttLHBybzIkZ3Jvd3RoX2ttLHBybzMkZ3Jvd3RoX2ttLHBybzQkZ3Jvd3RoX2ttLHBybzUkZ3Jvd3RoX2ttLG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDI1MCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKcHJvMWggPSByZXNbcmVzJGZpcmVfZGF5ID09IDEgJiByZXMkaHVtYW4gPT0gMiAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm8yaCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMiAmIHJlcyRodW1hbiA9PSAyICYgKHJlcyRlY28xID09IDYgfCByZXMkZWNvMSA9PSA3KSxdCnBybzNoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAzICYgcmVzJGh1bWFuID09IDIgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KcHJvNGggPSByZXNbcmVzJGZpcmVfZGF5ID09IDQgJiByZXMkaHVtYW4gPT0gMiAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm81aCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNSAmIHJlcyRodW1hbiA9PSAyICYgKHJlcyRlY28xID09IDYgfCByZXMkZWNvMSA9PSA3KSxdCgpib3hwbG90KHBybzFoJGdyb3d0aF9rbSxwcm8yaCRncm93dGhfa20scHJvM2gkZ3Jvd3RoX2ttLHBybzRoJGdyb3d0aF9rbSxwcm81aCRncm93dGhfa20sbmFtZXM9YygiZGF5MSIsImRheTIiLCJkYXkzIiwiZGF5NCIsImRheTUiKSx4bGFiPSIiLHlsYWI9ImZpcmUgc2l6ZSAoa20yKSIseWxpbT1jKDAsMjUwKSwgY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCgptZVsxXSA9bWVhbihwcm8xJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzJdID1tZWFuKHBybzIkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbM10gPW1lYW4ocHJvMyRncm93dGhfa20sbmEub21pdD1UKQptZVs0XSA9bWVhbihwcm80JGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzVdID1tZWFuKHBybzUkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKCm1lMVsxXSA9bWVhbihwcm8xaCRncm93dGhfa20sbmEucm09VCkKbWUxWzJdID1tZWFuKHBybzJoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbM10gPW1lYW4ocHJvM2gkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVs0XSA9bWVhbihwcm80aCRncm93dGhfa20sbmEucm09VCkKbWUxWzVdID1tZWFuKHBybzVoJGdyb3d0aF9rbSxuYS5ybT1UKQoKCnBhcihtZ3A9YygyLjMsMSwwKSkgIApwbG90KG1lLHR5cGU9Im8iLCB5bGltPWMoMCwxNTApLHlsYWI9ZXhwcmVzc2lvbigiZmlyZSBzaXplIChrbSJeMioiKSIpLHhsYWI9IiIsIHhheHQ9J24nLCBsdHkgPSAxLCBsd2QgPSAyLGNleC5sYWI9MS4yKQpheGlzKHNpZGU9MSwgYXQ9YygxOjUpLGxhYmVscz1kYXlzKQpwb2ludHMobWUxLHR5cGU9Im8iLGx0eSA9IDIsIGx3ZCA9IDIpCgpwZGYoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3Mvc3VwX2ZpZzQvbm9ydGgucGRmIiwgd2lkdGggPSA0LCBoZWlnaHQgPSA1KQpwYXIobWdwPWMoMi4zLDEsMCkpICAKcGxvdChtZSx0eXBlPSJvIiwgeWxpbT1jKDAsMTUwKSx5bGFiPWV4cHJlc3Npb24oImZpcmUgc2l6ZSAoa20iXjIqIikiKSx4bGFiPSIiLCB4YXh0PSduJywgbHR5ID0gMSwgbHdkID0gMixjZXgubGFiPTEuMikKYXhpcyhzaWRlPTEsIGF0PWMoMTo1KSxsYWJlbHM9ZGF5czEpCnBvaW50cyhtZTEsdHlwZT0ibyIsbHR5ID0gMiwgbHdkID0gMikKZGV2Lm9mZigpIAoKCnQudGVzdChsb2cocHJvMSRncm93dGhfa20pLGxvZyhwcm8xaCRncm93dGhfa20pKQp0LnRlc3QobG9nKHBybzIkZ3Jvd3RoX2ttKSxsb2cocHJvMmgkZ3Jvd3RoX2ttKSkKdC50ZXN0KGxvZyhwcm8zJGdyb3d0aF9rbSksbG9nKHBybzNoJGdyb3d0aF9rbSkpCnQudGVzdChsb2cocHJvNCRncm93dGhfa20pLGxvZyhwcm80aCRncm93dGhfa20pKQp0LnRlc3QobG9nKHBybzUkZ3Jvd3RoX2ttKSxsb2cocHJvNWgkZ3Jvd3RoX2ttKSkKCm1lYW4ocHJvMSRncm93dGhfa20sbmEub21pdD1UKQptZWFuKHBybzFoJGdyb3d0aF9rbSxuYS5ybT1UKQoKYGBgCgojIyMjIyMjIyMjIyMjIyMjIyMgZm9yIG1lZGl0ZXJhbmVhbiBjYWxpZm9ybmlhICAjIyMjIyMjIyMjIyMjIyMjIyMKCmBgYHtyfQpwcm8xID0gcmVzW3JlcyRmaXJlX2RheSA9PSAxICYgcmVzJGh1bWFuID09IDEgJiAocmVzJGVjbzEgPT0gMTEpLF0KcHJvMiA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMiAmIHJlcyRodW1hbiA9PSAxICYgKHJlcyRlY28xID09IDExKSxdCnBybzMgPSByZXNbcmVzJGZpcmVfZGF5ID09IDMgJiByZXMkaHVtYW4gPT0gMSAmIChyZXMkZWNvMSA9PSAxMSksXQpwcm80ID0gcmVzW3JlcyRmaXJlX2RheSA9PSA0ICYgcmVzJGh1bWFuID09IDEgJiAocmVzJGVjbzEgPT0gMTEpLF0KcHJvNSA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNSAmIHJlcyRodW1hbiA9PSAxICYgKHJlcyRlY28xID09IDExKSxdCgpib3hwbG90KHBybzEkZ3Jvd3RoX2ttLHBybzIkZ3Jvd3RoX2ttLHBybzMkZ3Jvd3RoX2ttLHBybzQkZ3Jvd3RoX2ttLHBybzUkZ3Jvd3RoX2ttLG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDMwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKcHJvMWggPSByZXNbcmVzJGZpcmVfZGF5ID09IDEgJiByZXMkaHVtYW4gPT0gMiAmIChyZXMkZWNvMSA9PSAxMSksXQpwcm8yaCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMiAmIHJlcyRodW1hbiA9PSAyICYgKHJlcyRlY28xID09IDExKSxdCnBybzNoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAzICYgcmVzJGh1bWFuID09IDIgJiAocmVzJGVjbzEgPT0gMTEpLF0KcHJvNGggPSByZXNbcmVzJGZpcmVfZGF5ID09IDQgJiByZXMkaHVtYW4gPT0gMiAmIChyZXMkZWNvMSA9PSAxMSksXQpwcm81aCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNSAmIHJlcyRodW1hbiA9PSAyICYgKHJlcyRlY28xID09IDExKSxdCgpib3hwbG90KHBybzFoJGdyb3d0aF9rbSxwcm8yaCRncm93dGhfa20scHJvM2gkZ3Jvd3RoX2ttLHBybzRoJGdyb3d0aF9rbSxwcm81aCRncm93dGhfa20sbmFtZXM9YygiZGF5MSIsImRheTIiLCJkYXkzIiwiZGF5NCIsImRheTUiKSx4bGFiPSIiLHlsYWI9ImZpcmUgc2l6ZSAoa20yKSIseWxpbT1jKDAsMzAwKSwgY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCgptZVsxXSA9bWVhbihwcm8xJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzJdID1tZWFuKHBybzIkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbM10gPW1lYW4ocHJvMyRncm93dGhfa20sbmEub21pdD1UKQptZVs0XSA9bWVhbihwcm80JGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzVdID1tZWFuKHBybzUkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKCm1lMVsxXSA9bWVhbihwcm8xaCRncm93dGhfa20sbmEucm09VCkKbWUxWzJdID1tZWFuKHBybzJoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbM10gPW1lYW4ocHJvM2gkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVs0XSA9bWVhbihwcm80aCRncm93dGhfa20sbmEucm09VCkKbWUxWzVdID1tZWFuKHBybzVoJGdyb3d0aF9rbSxuYS5ybT1UKQoKCnBhcihtZ3A9YygyLjMsMSwwKSkgIApwbG90KG1lLHR5cGU9Im8iLCB5bGltPWMoMCwxNTApLHlsYWI9ZXhwcmVzc2lvbigiZmlyZSBzaXplIChrbSJeMioiKSIpLHhsYWI9IiIsIHhheHQ9J24nLCBsdHkgPSAxLCBsd2QgPSAyLGNleC5sYWI9MS4yKQpheGlzKHNpZGU9MSwgYXQ9YygxOjUpLGxhYmVscz1kYXlzKQpwb2ludHMobWUxLHR5cGU9Im8iLGx0eSA9IDIsIGx3ZCA9IDIpCgpwZGYoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3Mvc3VwX2ZpZzQvbWVkLnBkZiIsIHdpZHRoID0gNCwgaGVpZ2h0ID0gNSkKcGFyKG1ncD1jKDIuMywxLDApKSAgCnBsb3QobWUsdHlwZT0ibyIsIHlsaW09YygwLDE1MCkseWxhYj1leHByZXNzaW9uKCJmaXJlIHNpemUgKGttIl4yKiIpIikseGxhYj0iIiwgeGF4dD0nbicsIGx0eSA9IDEsIGx3ZCA9IDIsY2V4LmxhYj0xLjIpCmF4aXMoc2lkZT0xLCBhdD1jKDE6NSksbGFiZWxzPWRheXMxKQpwb2ludHMobWUxLHR5cGU9Im8iLGx0eSA9IDIsIGx3ZCA9IDIpCmRldi5vZmYoKSAKCgpgYGAKIyMjIyMjIyMjIyMjIyMjIyMjIGZvciBkaWZmZXJlbmNlIGluIGF1dHVtbiAgIyMjIyMjIyMjIyMjIyMjIyMjCmBgYHtyfQpwcm8xID0gcmVzW3JlcyRmaXJlX2RheSA9PSAxICYgcmVzJGh1bWFuID09IDEgJiByZXMkbW9udGggPjgsXQpwcm8yID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDEgJiByZXMkbW9udGggPjgsXQpwcm8zID0gcmVzW3JlcyRmaXJlX2RheSA9PSAzICYgcmVzJGh1bWFuID09IDEgJiByZXMkbW9udGggPjgsXQpwcm80ID0gcmVzW3JlcyRmaXJlX2RheSA9PSA0ICYgcmVzJGh1bWFuID09IDEgJiByZXMkbW9udGggPjgsXQpwcm81ID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDEgJiByZXMkbW9udGggPjgsXQoKYm94cGxvdChwcm8xJGdyb3d0aF9rbSxwcm8yJGdyb3d0aF9rbSxwcm8zJGdyb3d0aF9rbSxwcm80JGdyb3d0aF9rbSxwcm81JGdyb3d0aF9rbSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCwzMDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCnBybzFoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAxICYgcmVzJGh1bWFuID09IDIgJiByZXMkbW9udGggPjgsXQpwcm8yaCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMiAmIHJlcyRodW1hbiA9PSAyICYgcmVzJG1vbnRoID44LF0KcHJvM2ggPSByZXNbcmVzJGZpcmVfZGF5ID09IDMgJiByZXMkaHVtYW4gPT0gMiAmIHJlcyRtb250aCA+OCxdCnBybzRoID0gcmVzW3JlcyRmaXJlX2RheSA9PSA0ICYgcmVzJGh1bWFuID09IDIgJiByZXMkbW9udGggPjgsXQpwcm81aCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNSAmIHJlcyRodW1hbiA9PSAyICYgcmVzJG1vbnRoID44LF0KCmJveHBsb3QocHJvMWgkZ3Jvd3RoX2ttLHBybzJoJGdyb3d0aF9rbSxwcm8zaCRncm93dGhfa20scHJvNGgkZ3Jvd3RoX2ttLHBybzVoJGdyb3d0aF9rbSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCwzMDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCm1lWzFdID1tZWFuKHBybzEkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbMl0gPW1lYW4ocHJvMiRncm93dGhfa20sbmEub21pdD1UKQptZVszXSA9bWVhbihwcm8zJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzRdID1tZWFuKHBybzQkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbNV0gPW1lYW4ocHJvNSRncm93dGhfa20sbmEub21pdD1UKQoKbWUxWzFdID1tZWFuKHBybzFoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbMl0gPW1lYW4ocHJvMmgkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVszXSA9bWVhbihwcm8zaCRncm93dGhfa20sbmEucm09VCkKbWUxWzRdID1tZWFuKHBybzRoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbNV0gPW1lYW4ocHJvNWgkZ3Jvd3RoX2ttLG5hLnJtPVQpCgoKcGFyKG1ncD1jKDIuMywxLDApKSAgCnBsb3QobWUsdHlwZT0ibyIsIHlsaW09YygwLDE1MCkseWxhYj1leHByZXNzaW9uKCJmaXJlIHNpemUgKGttIl4yKiIpIikseGxhYj0iIiwgeGF4dD0nbicsIGx0eSA9IDEsIGx3ZCA9IDIsY2V4LmxhYj0xLjIpCmF4aXMoc2lkZT0xLCBhdD1jKDE6NSksbGFiZWxzPWRheXMpCnBvaW50cyhtZTEsdHlwZT0ibyIsbHR5ID0gMiwgbHdkID0gMikKCnBkZigiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9zdXBfZmlnNC9hdXR1bW4ucGRmIiwgd2lkdGggPSA0LCBoZWlnaHQgPSA1KQpwYXIobWdwPWMoMi4zLDEsMCkpICAKcGxvdChtZSx0eXBlPSJvIiwgeWxpbT1jKDAsMjUwKSx5bGFiPWV4cHJlc3Npb24oImZpcmUgc2l6ZSAoa20iXjIqIikiKSx4bGFiPSIiLCB4YXh0PSduJywgbHR5ID0gMSwgbHdkID0gMixjZXgubGFiPTEuMikKYXhpcyhzaWRlPTEsIGF0PWMoMTo1KSxsYWJlbHM9ZGF5czEpCnBvaW50cyhtZTEsdHlwZT0ibyIsbHR5ID0gMiwgbHdkID0gMikKZGV2Lm9mZigpIAoKCmBgYAoKIyMjIyMjIyMjIyMjIyMjIyMjIGZvciBkaWZmZXJlbmNlIGluIHN1bW1lciAgIyMjIyMjIyMjIyMjIyMjIyMjCgpgYGB7cn0KcHJvMSA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMSAmIHJlcyRodW1hbiA9PSAxICYgcmVzJG1vbnRoIDw9OCAsXQpwcm8yID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDEgJiByZXMkbW9udGggPD04LF0KcHJvMyA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMyAmIHJlcyRodW1hbiA9PSAxICYgcmVzJG1vbnRoIDw9OCxdCnBybzQgPSByZXNbcmVzJGZpcmVfZGF5ID09IDQgJiByZXMkaHVtYW4gPT0gMSAmIHJlcyRtb250aCA8PTgsXQpwcm81ID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDEgJiByZXMkbW9udGggPD04LF0KCmJveHBsb3QocHJvMSRncm93dGhfa20scHJvMiRncm93dGhfa20scHJvMyRncm93dGhfa20scHJvNCRncm93dGhfa20scHJvNSRncm93dGhfa20sbmFtZXM9YygiZGF5MSIsImRheTIiLCJkYXkzIiwiZGF5NCIsImRheTUiKSx4bGFiPSIiLHlsYWI9ImZpcmUgc2l6ZSAoa20yKSIseWxpbT1jKDAsMzAwKSwgY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCgpwcm8xaCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMSAmIHJlcyRodW1hbiA9PSAyICYgcmVzJG1vbnRoIDw9OCxdCnBybzJoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDIgJiByZXMkbW9udGggPD04LF0KcHJvM2ggPSByZXNbcmVzJGZpcmVfZGF5ID09IDMgJiByZXMkaHVtYW4gPT0gMiAmIHJlcyRtb250aCA8PTgsXQpwcm80aCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNCAmIHJlcyRodW1hbiA9PSAyICYgcmVzJG1vbnRoIDw9OCxdCnBybzVoID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDIgJiByZXMkbW9udGggPD04LF0KCmJveHBsb3QocHJvMWgkZ3Jvd3RoX2ttLHBybzJoJGdyb3d0aF9rbSxwcm8zaCRncm93dGhfa20scHJvNGgkZ3Jvd3RoX2ttLHBybzVoJGdyb3d0aF9rbSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCwzMDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCm1lWzFdID1tZWFuKHBybzEkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbMl0gPW1lYW4ocHJvMiRncm93dGhfa20sbmEub21pdD1UKQptZVszXSA9bWVhbihwcm8zJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzRdID1tZWFuKHBybzQkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbNV0gPW1lYW4ocHJvNSRncm93dGhfa20sbmEub21pdD1UKQoKbWUxWzFdID1tZWFuKHBybzFoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbMl0gPW1lYW4ocHJvMmgkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVszXSA9bWVhbihwcm8zaCRncm93dGhfa20sbmEucm09VCkKbWUxWzRdID1tZWFuKHBybzRoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbNV0gPW1lYW4ocHJvNWgkZ3Jvd3RoX2ttLG5hLnJtPVQpCgoKcGFyKG1ncD1jKDIuMywxLDApKSAgCnBsb3QobWUsdHlwZT0ibyIsIHlsaW09YygwLDE1MCkseWxhYj1leHByZXNzaW9uKCJmaXJlIHNpemUgKGttIl4yKiIpIikseGxhYj0iIiwgeGF4dD0nbicsIGx0eSA9IDEsIGx3ZCA9IDIsY2V4LmxhYj0xLjIpCmF4aXMoc2lkZT0xLCBhdD1jKDE6NSksbGFiZWxzPWRheXMpCnBvaW50cyhtZTEsdHlwZT0ibyIsbHR5ID0gMiwgbHdkID0gMikKCnBkZigiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9zdXBfZmlnNC9zdW1tZXIucGRmIiwgd2lkdGggPSA0LCBoZWlnaHQgPSA1KQpwYXIobWdwPWMoMi4zLDEsMCkpICAKcGxvdChtZSx0eXBlPSJvIiwgeWxpbT1jKDAsMTUwKSx5bGFiPWV4cHJlc3Npb24oImZpcmUgc2l6ZSAoa20iXjIqIikiKSx4bGFiPSIiLCB4YXh0PSduJywgbHR5ID0gMSwgbHdkID0gMixjZXgubGFiPTEuMikKYXhpcyhzaWRlPTEsIGF0PWMoMTo1KSxsYWJlbHM9ZGF5czEpCnBvaW50cyhtZTEsdHlwZT0ibyIsbHR5ID0gMiwgbHdkID0gMikKZGV2Lm9mZigpIAoKYGBgCgojIyMjIyMjIyMjIyMjIyMjIyMgZm9yIGRpZmZlcmVuY2UgaW4gc3VtbWVyIGluIHdlc3Rlcm4gY29yZGlsbGVyYSAgIyMjIyMjIyMjIyMjIyMjIyMjCgpgYGB7cn0KcHJvMSA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMSAmIHJlcyRodW1hbiA9PSAxICYgKCByZXMkbW9udGggPD04ICYgcmVzJG1vbnRoID41ICkgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KcHJvMiA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMiAmIHJlcyRodW1hbiA9PSAxICYgKCByZXMkbW9udGggPD04ICYgcmVzJG1vbnRoID41ICkgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KcHJvMyA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMyAmIHJlcyRodW1hbiA9PSAxICYgKCByZXMkbW9udGggPD04ICYgcmVzJG1vbnRoID41ICkgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KcHJvNCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNCAmIHJlcyRodW1hbiA9PSAxICYgKCByZXMkbW9udGggPD04ICYgcmVzJG1vbnRoID41ICkgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KcHJvNSA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNSAmIHJlcyRodW1hbiA9PSAxICYgKCByZXMkbW9udGggPD04ICYgcmVzJG1vbnRoID41ICkgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KCmJveHBsb3QocHJvMSRncm93dGhfa20scHJvMiRncm93dGhfa20scHJvMyRncm93dGhfa20scHJvNCRncm93dGhfa20scHJvNSRncm93dGhfa20sbmFtZXM9YygiZGF5MSIsImRheTIiLCJkYXkzIiwiZGF5NCIsImRheTUiKSx4bGFiPSIiLHlsYWI9ImZpcmUgc2l6ZSAoa20yKSIseWxpbT1jKDAsMzAwKSwgY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCgpwcm8xaCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMSAmIHJlcyRodW1hbiA9PSAyICYgKCByZXMkbW9udGggPD04ICYgcmVzJG1vbnRoID41ICkgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KcHJvMmggPSByZXNbcmVzJGZpcmVfZGF5ID09IDIgJiByZXMkaHVtYW4gPT0gMiAmICggcmVzJG1vbnRoIDw9OCAmIHJlcyRtb250aCA+NSApICYgKHJlcyRlY28xID09IDYgfCByZXMkZWNvMSA9PSA3KSxdCnBybzNoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAzICYgcmVzJGh1bWFuID09IDIgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm80aCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNCAmIHJlcyRodW1hbiA9PSAyICYgKCByZXMkbW9udGggPD04ICYgcmVzJG1vbnRoID41ICkgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KcHJvNWggPSByZXNbcmVzJGZpcmVfZGF5ID09IDUgJiByZXMkaHVtYW4gPT0gMiAmICggcmVzJG1vbnRoIDw9OCAmIHJlcyRtb250aCA+NSApICYgKHJlcyRlY28xID09IDYgfCByZXMkZWNvMSA9PSA3KSxdCgpib3hwbG90KHBybzFoJGdyb3d0aF9rbSxwcm8yaCRncm93dGhfa20scHJvM2gkZ3Jvd3RoX2ttLHBybzRoJGdyb3d0aF9rbSxwcm81aCRncm93dGhfa20sbmFtZXM9YygiZGF5MSIsImRheTIiLCJkYXkzIiwiZGF5NCIsImRheTUiKSx4bGFiPSIiLHlsYWI9ImZpcmUgc2l6ZSAoa20yKSIseWxpbT1jKDAsMzAwKSwgY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCgp0LnRlc3QobG9nKHBybzEkZ3Jvd3RoX2ttKSxsb2cocHJvMWgkZ3Jvd3RoX2ttKSkKdC50ZXN0KGxvZyhwcm8yJGdyb3d0aF9rbSksbG9nKHBybzJoJGdyb3d0aF9rbSkpCnQudGVzdChsb2cocHJvMyRncm93dGhfa20pLGxvZyhwcm8zaCRncm93dGhfa20pKQp0LnRlc3QobG9nKHBybzQkZ3Jvd3RoX2ttKSxsb2cocHJvNGgkZ3Jvd3RoX2ttKSkKdC50ZXN0KGxvZyhwcm81JGdyb3d0aF9rbSksbG9nKHBybzVoJGdyb3d0aF9rbSkpCgptZVsxXSA9bWVhbihwcm8xJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzJdID1tZWFuKHBybzIkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbM10gPW1lYW4ocHJvMyRncm93dGhfa20sbmEub21pdD1UKQptZVs0XSA9bWVhbihwcm80JGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzVdID1tZWFuKHBybzUkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKCm1lMVsxXSA9bWVhbihwcm8xaCRncm93dGhfa20sbmEucm09VCkKbWUxWzJdID1tZWFuKHBybzJoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbM10gPW1lYW4ocHJvM2gkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVs0XSA9bWVhbihwcm80aCRncm93dGhfa20sbmEucm09VCkKbWUxWzVdID1tZWFuKHBybzVoJGdyb3d0aF9rbSxuYS5ybT1UKQoKcGFyKG1ncD1jKDIuMywxLDApKSAgCnBsb3QobWUsdHlwZT0ibyIsIHlsaW09YygwLDE1MCkseWxhYj1leHByZXNzaW9uKCJmaXJlIHNpemUgKGttIl4yKiIpIikseGxhYj0iIiwgeGF4dD0nbicsIGx0eSA9IDEsIGx3ZCA9IDIsY2V4LmxhYj0xLjIpCmF4aXMoc2lkZT0xLCBhdD1jKDE6NSksbGFiZWxzPWRheXMpCnBvaW50cyhtZTEsdHlwZT0ibyIsbHR5ID0gMiwgbHdkID0gMikKCnBkZigiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9zdXBfZmlnNC9ub3J0aF9zdW1tZXIucGRmIiwgd2lkdGggPSA0LCBoZWlnaHQgPSA1KQpwYXIobWdwPWMoMi4zLDEsMCkpICAKcGxvdChtZSx0eXBlPSJvIiwgeWxpbT1jKDAsMTUwKSx5bGFiPWV4cHJlc3Npb24oImZpcmUgc2l6ZSAoa20iXjIqIikiKSx4bGFiPSIiLCB4YXh0PSduJywgbHR5ID0gMSwgbHdkID0gMixjZXgubGFiPTEuMikKYXhpcyhzaWRlPTEsIGF0PWMoMTo1KSxsYWJlbHM9ZGF5czEpCnBvaW50cyhtZTEsdHlwZT0ibyIsbHR5ID0gMiwgbHdkID0gMikKZGV2Lm9mZigpIAoKCmBgYAoKIyMjIyMjIyMjIyMjIyMjIyMjIGZvciBkaWZmZXJlbmNlIGluIGF1dHVtbiBpbiB3ZXN0ZXJuIGNvcmRpbGxlcmEgICMjIyMjIyMjIyMjIyMjIyMjIwpgYGB7cn0KcHJvMSA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMSAmIHJlcyRodW1hbiA9PSAxICYgKCByZXMkbW9udGggPjggKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm8yID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA+OCApICYgKHJlcyRlY28xID09IDYgfCByZXMkZWNvMSA9PSA3KSxdCnBybzMgPSByZXNbcmVzJGZpcmVfZGF5ID09IDMgJiByZXMkaHVtYW4gPT0gMSAmICggcmVzJG1vbnRoID44ICkgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KcHJvNCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNCAmIHJlcyRodW1hbiA9PSAxICYgKCByZXMkbW9udGggPjggKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm81ID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA+OCApICYgKHJlcyRlY28xID09IDYgfCByZXMkZWNvMSA9PSA3KSxdCgpib3hwbG90KHBybzEkZ3Jvd3RoX2ttLHBybzIkZ3Jvd3RoX2ttLHBybzMkZ3Jvd3RoX2ttLHBybzQkZ3Jvd3RoX2ttLHBybzUkZ3Jvd3RoX2ttLG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDMwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKcHJvMWggPSByZXNbcmVzJGZpcmVfZGF5ID09IDEgJiByZXMkaHVtYW4gPT0gMiAmICggcmVzJG1vbnRoID44ICkgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KcHJvMmggPSByZXNbcmVzJGZpcmVfZGF5ID09IDIgJiByZXMkaHVtYW4gPT0gMiAmICggcmVzJG1vbnRoID44ICkgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KcHJvM2ggPSByZXNbcmVzJGZpcmVfZGF5ID09IDMgJiByZXMkaHVtYW4gPT0gMiAmICggcmVzJG1vbnRoID44ICkgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KcHJvNGggPSByZXNbcmVzJGZpcmVfZGF5ID09IDQgJiByZXMkaHVtYW4gPT0gMiAmIChyZXMkbW9udGggPjggKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm81aCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNSAmIHJlcyRodW1hbiA9PSAyICYgKCByZXMkbW9udGggPjggKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQoKYm94cGxvdChwcm8xaCRncm93dGhfa20scHJvMmgkZ3Jvd3RoX2ttLHBybzNoJGdyb3d0aF9rbSxwcm80aCRncm93dGhfa20scHJvNWgkZ3Jvd3RoX2ttLG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDMwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKbWVbMV0gPW1lYW4ocHJvMSRncm93dGhfa20sbmEub21pdD1UKQptZVsyXSA9bWVhbihwcm8yJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzNdID1tZWFuKHBybzMkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbNF0gPW1lYW4ocHJvNCRncm93dGhfa20sbmEub21pdD1UKQptZVs1XSA9bWVhbihwcm81JGdyb3d0aF9rbSxuYS5vbWl0PVQpCgptZTFbMV0gPW1lYW4ocHJvMWgkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVsyXSA9bWVhbihwcm8yaCRncm93dGhfa20sbmEucm09VCkKbWUxWzNdID1tZWFuKHBybzNoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbNF0gPW1lYW4ocHJvNGgkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVs1XSA9bWVhbihwcm81aCRncm93dGhfa20sbmEucm09VCkKCnBhcihtZ3A9YygyLjMsMSwwKSkgIApwbG90KG1lLHR5cGU9Im8iLCB5bGltPWMoMCwxNTApLHlsYWI9ZXhwcmVzc2lvbigiZmlyZSBzaXplIChrbSJeMioiKSIpLHhsYWI9IiIsIHhheHQ9J24nLCBsdHkgPSAxLCBsd2QgPSAyLGNleC5sYWI9MS4yKQpheGlzKHNpZGU9MSwgYXQ9YygxOjUpLGxhYmVscz1kYXlzKQpwb2ludHMobWUxLHR5cGU9Im8iLGx0eSA9IDIsIGx3ZCA9IDIpCgpwZGYoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3Mvc3VwX2ZpZzQvbm9ydGhfYXV0dW1uLnBkZiIsIHdpZHRoID0gNCwgaGVpZ2h0ID0gNSkKcGFyKG1ncD1jKDIuMywxLDApKSAgCnBsb3QobWUsdHlwZT0ibyIsIHlsaW09YygwLDI1MCkseWxhYj1leHByZXNzaW9uKCJmaXJlIHNpemUgKGttIl4yKiIpIikseGxhYj0iIiwgeGF4dD0nbicsIGx0eSA9IDEsIGx3ZCA9IDIsY2V4LmxhYj0xLjIpCmF4aXMoc2lkZT0xLCBhdD1jKDE6NSksbGFiZWxzPWRheXMxKQpwb2ludHMobWUxLHR5cGU9Im8iLGx0eSA9IDIsIGx3ZCA9IDIpCmRldi5vZmYoKSAKCgpgYGAKIyMjIyMjIyMjIyMjIyMjIyMjIGZvciBkaWZmZXJlbmNlIGluIHN1bW1lciBpbiBtZWRpdGVyZWFuZWFuICAjIyMjIyMjIyMjIyMjIyMjIyMKCmBgYHtyfQpwcm8xID0gcmVzW3JlcyRmaXJlX2RheSA9PSAxICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSAxMSksXQpwcm8yID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSAxMSksXQpwcm8zID0gcmVzW3JlcyRmaXJlX2RheSA9PSAzICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSAxMSksXQpwcm80ID0gcmVzW3JlcyRmaXJlX2RheSA9PSA0ICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSAxMSksXQpwcm81ID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSAxMSksXQoKYm94cGxvdChwcm8xJGdyb3d0aF9rbSxwcm8yJGdyb3d0aF9rbSxwcm8zJGdyb3d0aF9rbSxwcm80JGdyb3d0aF9rbSxwcm81JGdyb3d0aF9rbSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCwzMDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCnBybzFoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAxICYgcmVzJGh1bWFuID09IDIgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSAxMSksXQpwcm8yaCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMiAmIHJlcyRodW1hbiA9PSAyICYgKCByZXMkbW9udGggPD04ICYgcmVzJG1vbnRoID41ICkgJiAocmVzJGVjbzEgPT0gMTEpLF0KcHJvM2ggPSByZXNbcmVzJGZpcmVfZGF5ID09IDMgJiByZXMkaHVtYW4gPT0gMiAmICggcmVzJG1vbnRoIDw9OCAmIHJlcyRtb250aCA+NSApICYgKHJlcyRlY28xID09IDExKSxdCnBybzRoID0gcmVzW3JlcyRmaXJlX2RheSA9PSA0ICYgcmVzJGh1bWFuID09IDIgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSAxMSksXQpwcm81aCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNSAmIHJlcyRodW1hbiA9PSAyICYgKCByZXMkbW9udGggPD04ICYgcmVzJG1vbnRoID41ICkgJiAocmVzJGVjbzEgPT0gMTEpLF0KCmJveHBsb3QocHJvMWgkZ3Jvd3RoX2ttLHBybzJoJGdyb3d0aF9rbSxwcm8zaCRncm93dGhfa20scHJvNGgkZ3Jvd3RoX2ttLHBybzVoJGdyb3d0aF9rbSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCwzMDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCiN0LnRlc3QobG9nKHBybzEkZ3Jvd3RoX2ttKSxsb2cocHJvMWgkZ3Jvd3RoX2ttKSkKI3QudGVzdChsb2cocHJvMiRncm93dGhfa20pLGxvZyhwcm8yaCRncm93dGhfa20pKQojdC50ZXN0KGxvZyhwcm8zJGdyb3d0aF9rbSksbG9nKHBybzNoJGdyb3d0aF9rbSkpCiN0LnRlc3QobG9nKHBybzQkZ3Jvd3RoX2ttKSxsb2cocHJvNGgkZ3Jvd3RoX2ttKSkKI3QudGVzdChsb2cocHJvNSRncm93dGhfa20pLGxvZyhwcm81aCRncm93dGhfa20pKQoKbWVbMV0gPW1lYW4ocHJvMSRncm93dGhfa20sbmEub21pdD1UKQptZVsyXSA9bWVhbihwcm8yJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzNdID1tZWFuKHBybzMkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbNF0gPW1lYW4ocHJvNCRncm93dGhfa20sbmEub21pdD1UKQptZVs1XSA9bWVhbihwcm81JGdyb3d0aF9rbSxuYS5vbWl0PVQpCgptZTFbMV0gPW1lYW4ocHJvMWgkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVsyXSA9bWVhbihwcm8yaCRncm93dGhfa20sbmEucm09VCkKbWUxWzNdID1tZWFuKHBybzNoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbNF0gPW1lYW4ocHJvNGgkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVs1XSA9bWVhbihwcm81aCRncm93dGhfa20sbmEucm09VCkKCnBhcihtZ3A9YygyLjMsMSwwKSkgIApwbG90KG1lLHR5cGU9Im8iLCB5bGltPWMoMCwxNTApLHlsYWI9ZXhwcmVzc2lvbigiZmlyZSBzaXplIChrbSJeMioiKSIpLHhsYWI9IiIsIHhheHQ9J24nLCBsdHkgPSAxLCBsd2QgPSAyLGNleC5sYWI9MS4yKQpheGlzKHNpZGU9MSwgYXQ9YygxOjUpLGxhYmVscz1kYXlzKQpwb2ludHMobWUxLHR5cGU9Im8iLGx0eSA9IDIsIGx3ZCA9IDIpCgpwZGYoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3Mvc3VwX2ZpZzQvbWVkX3N1bW1lci5wZGYiLCB3aWR0aCA9IDQsIGhlaWdodCA9IDUpCnBhcihtZ3A9YygyLjMsMSwwKSkgIApwbG90KG1lLHR5cGU9Im8iLCB5bGltPWMoMCwxNTApLHlsYWI9ZXhwcmVzc2lvbigiZmlyZSBzaXplIChrbSJeMioiKSIpLHhsYWI9IiIsIHhheHQ9J24nLCBsdHkgPSAxLCBsd2QgPSAyLGNleC5sYWI9MS4yKQpheGlzKHNpZGU9MSwgYXQ9YygxOjUpLGxhYmVscz1kYXlzMSkKcG9pbnRzKG1lMSx0eXBlPSJvIixsdHkgPSAyLCBsd2QgPSAyKQpkZXYub2ZmKCkgCgoKYGBgCgpgCiMjIyMjIyMjIyMjIyMjIyMjIyBmb3IgZGlmZmVyZW5jZSBpbiBhdXR1bW4gaW4gbWVkaXRlcmFuZWFuICAjIyMjIyMjIyMjIyMjIyMjIyMKYGBge3J9CnBybzEgPSByZXNbcmVzJGZpcmVfZGF5ID09IDEgJiByZXMkaHVtYW4gPT0gMSAmICggcmVzJG1vbnRoID44ICkgJiAocmVzJGVjbzEgPT0gMTEpLF0KcHJvMiA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMiAmIHJlcyRodW1hbiA9PSAxICYgKCByZXMkbW9udGggPjggKSAmIChyZXMkZWNvMSA9PSAxMSksXQpwcm8zID0gcmVzW3JlcyRmaXJlX2RheSA9PSAzICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA+OCApICYgKHJlcyRlY28xID09IDExKSxdCnBybzQgPSByZXNbcmVzJGZpcmVfZGF5ID09IDQgJiByZXMkaHVtYW4gPT0gMSAmICggcmVzJG1vbnRoID44ICkgJiAocmVzJGVjbzEgPT0gMTEpLF0KcHJvNSA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNSAmIHJlcyRodW1hbiA9PSAxICYgKCByZXMkbW9udGggPjggKSAmIChyZXMkZWNvMSA9PSAxMSksXQoKYm94cGxvdChwcm8xJGdyb3d0aF9rbSxwcm8yJGdyb3d0aF9rbSxwcm8zJGdyb3d0aF9rbSxwcm80JGdyb3d0aF9rbSxwcm81JGdyb3d0aF9rbSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCwzMDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCnBybzFoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAxICYgcmVzJGh1bWFuID09IDIgJiAoIHJlcyRtb250aCA+OCApICYgKHJlcyRlY28xID09IDExKSxdCnBybzJoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDIgJiAoIHJlcyRtb250aCA+OCApICYgKHJlcyRlY28xID09IDExKSxdCnBybzNoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAzICYgcmVzJGh1bWFuID09IDIgJiAoIHJlcyRtb250aCA+OCApICYgKHJlcyRlY28xID09IDExKSxdCnBybzRoID0gcmVzW3JlcyRmaXJlX2RheSA9PSA0ICYgcmVzJGh1bWFuID09IDIgJiAoIHJlcyRtb250aCA+OCApICYgKHJlcyRlY28xID09IDExKSxdCnBybzVoID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDIgJiAoIHJlcyRtb250aCA+OCApICYgKHJlcyRlY28xID09IDExKSxdCgpib3hwbG90KHBybzFoJGdyb3d0aF9rbSxwcm8yaCRncm93dGhfa20scHJvM2gkZ3Jvd3RoX2ttLHBybzRoJGdyb3d0aF9rbSxwcm81aCRncm93dGhfa20sbmFtZXM9YygiZGF5MSIsImRheTIiLCJkYXkzIiwiZGF5NCIsImRheTUiKSx4bGFiPSIiLHlsYWI9ImZpcmUgc2l6ZSAoa20yKSIseWxpbT1jKDAsMzAwKSwgY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCgptZVsxXSA9bWVhbihwcm8xJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzJdID1tZWFuKHBybzIkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbM10gPW1lYW4ocHJvMyRncm93dGhfa20sbmEub21pdD1UKQptZVs0XSA9bWVhbihwcm80JGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzVdID1tZWFuKHBybzUkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKCm1lMVsxXSA9bWVhbihwcm8xaCRncm93dGhfa20sbmEucm09VCkKbWUxWzJdID1tZWFuKHBybzJoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbM10gPW1lYW4ocHJvM2gkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVs0XSA9bWVhbihwcm80aCRncm93dGhfa20sbmEucm09VCkKbWUxWzVdID1tZWFuKHBybzVoJGdyb3d0aF9rbSxuYS5ybT1UKQoKcGFyKG1ncD1jKDIuMywxLDApKSAgCnBsb3QobWUsdHlwZT0ibyIsIHlsaW09YygwLDE1MCkseWxhYj1leHByZXNzaW9uKCJmaXJlIHNpemUgKGttIl4yKiIpIikseGxhYj0iIiwgeGF4dD0nbicsIGx0eSA9IDEsIGx3ZCA9IDIsY2V4LmxhYj0xLjIpCmF4aXMoc2lkZT0xLCBhdD1jKDE6NSksbGFiZWxzPWRheXMpCnBvaW50cyhtZTEsdHlwZT0ibyIsbHR5ID0gMiwgbHdkID0gMikKCnBkZigiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9zdXBfZmlnNC9tZWRfYXV0dW1uLnBkZiIsIHdpZHRoID0gNCwgaGVpZ2h0ID0gNSkKcGFyKG1ncD1jKDIuMywxLDApKSAgCnBsb3QobWUsdHlwZT0ibyIsIHlsaW09YygwLDQwMCkseWxhYj1leHByZXNzaW9uKCJmaXJlIHNpemUgKGttIl4yKiIpIikseGxhYj0iIiwgeGF4dD0nbicsIGx0eSA9IDEsIGx3ZCA9IDIsY2V4LmxhYj0xLjIpCmF4aXMoc2lkZT0xLCBhdD1jKDE6NSksbGFiZWxzPWRheXMxKQpwb2ludHMobWUxLHR5cGU9Im8iLGx0eSA9IDIsIGx3ZCA9IDIpCmRldi5vZmYoKSAKCgpgYGAKCiMjIyMjIyMjIyMjIyBob3cgbWFueSBkYXlzIGRvZXMgaXQgdGFrZSB0byByZWFjaCA3NSUgYnVybnQgYXJlYSAjIyMjIyMjIyMjIyMjIyMjIwoKYGBge3J9CnJlczc1ID0gcmVzW3JlcyRwZXJfYmEgPiAwLjc1LF0KI3BlYWtfZGF5ID0gYXMuZGF0YS5mcmFtZShhZ2dyZWdhdGUocmVzNzUkZmlyZV9kYXksIGJ5ID0gbGlzdChyZXM3NSRmaXJlbmFtZSxyZXM3NSRjYXVzZSksIG1pbikpCiNwZWFrX2RheT1zdWJzZXQocGVha19kYXkseCA8IDU1KQojaGkgPSBoaXN0KHBlYWtfZGF5JHgscHJvYiA9RiwgYnJlYWtzPSBjKDA6NTQpLCB4bGltPWMoMCw1NSksIHlsYWI9Im51bWJlciBvZiBmaXJlcyIsIHhsYWI9ImRheXMiLCBjZXgubGFiPTEuNCxjZXguYXhpcz0xLjMpCgpvdXQxID0gc3Vic2V0KHJlczc1LGNhdXNlID09IDEgKSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgpvdXQyID0gc3Vic2V0KHJlczc1LGNhdXNlICE9MSAmIGNhdXNlICE9IDE0ICkKcGVha19kYXkxID0gYXMuZGF0YS5mcmFtZShhZ2dyZWdhdGUob3V0MSRmaXJlX2RheSwgYnkgPSBsaXN0KG91dDEkZmlyZW5hbWUpLCBtaW4pKQpwZWFrX2RheTIgPSBhcy5kYXRhLmZyYW1lKGFnZ3JlZ2F0ZShvdXQyJGZpcmVfZGF5LCBieSA9IGxpc3Qob3V0MiRmaXJlbmFtZSksIG1pbikpCnBlYWs9YXMuZGF0YS5mcmFtZShhZ2dyZWdhdGUocmVzNzUkZmlyZV9kYXksIGJ5ID0gbGlzdChyZXM3NSRmaXJlbmFtZSksIG1pbikpCnF1YW50aWxlKHBlYWtfZGF5MSR4LDAuNTAsdHlwZT0zKSAKcXVhbnRpbGUocGVha19kYXkyJHgsMC41MCx0eXBlPTMpIAoKcGVha19kYXkxPXN1YnNldChwZWFrX2RheTEseCA8IDU2KQpwZWFrX2RheTI9c3Vic2V0KHBlYWtfZGF5Mix4IDwgNTYpCmhpc3QuYSA9aGlzdChwZWFrX2RheTEkeCxicmVha3MgPWMoMDo1NSkscGxvdD1GKQpoaXN0LmIgPWhpc3QocGVha19kYXkyJHgsYnJlYWtzID1jKDA6NTUpLHBsb3Q9RikKZmcgPSByYmluZChoaXN0LmEkY291bnRzLGhpc3QuYiRjb3VudHMpCgpmciA9IGJhcnBsb3QoZmcseGxhYj0iRGF5cyBhZnRlciBpZ25pdGlvbiIseWxhYj0iTnVtYmVyIG9mIGZpcmVzIixjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMywgeGxpbT1jKDEsNjUpLCB5bGltPWMoMCwzMCkpCmF4aXMoMSxjKDAuNyw1LjUsMTEuNSwxNy41LDIzLjUsMjkuNSwzNS41LDQxLjUsNDcuNSw1My41LDU5LjUsNjUuNSksbGFiZWxzPWMoMSw1LDEwLDE1LDIwLDI1LDMwLDM1LDQwLDQ1LDUwLDU1KSxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKCnBkZihmaWxlPSIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL3RpbWVfdG9fcmVhY2g3NS5wZGYiLHdpZHRoPTcsaGVpZ2h0PTUpCmZyID0gYmFycGxvdChmZyx4bGFiPSJEYXlzIGFmdGVyIGlnbml0aW9uIix5bGFiPSJOdW1iZXIgb2YgZmlyZXMiLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zLCB4bGltPWMoMSw2NSksIHlsaW09YygwLDMwKSkKYXhpcygxLGMoMC43LDUuNSwxMS41LDE3LjUsMjMuNSwyOS41LDM1LjUsNDEuNSw0Ny41LDUzLjUsNTkuNSw2NS41KSxsYWJlbHM9YygxLDUsMTAsMTUsMjAsMjUsMzAsMzUsNDAsNDUsNTAsNTUpLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQpkZXYub2ZmKCkKCiMjIyMjIyMjICBtZWRpdGVyYW5lYW4gICMjIyMjIyMjIyMjCm91dDEgPSBzdWJzZXQocmVzNzUsY2F1c2UgPT0gMSAmIHJlczc1JGVjbzEgPT0gMTEpICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCm91dDIgPSBzdWJzZXQocmVzNzUsY2F1c2UgIT0xICYgY2F1c2UgIT0gMTQgJiByZXM3NSRlY28xID09IDExKQpwZWFrX2RheTEgPSBhcy5kYXRhLmZyYW1lKGFnZ3JlZ2F0ZShvdXQxJGZpcmVfZGF5LCBieSA9IGxpc3Qob3V0MSRmaXJlbmFtZSksIG1pbikpCnBlYWtfZGF5MiA9IGFzLmRhdGEuZnJhbWUoYWdncmVnYXRlKG91dDIkZmlyZV9kYXksIGJ5ID0gbGlzdChvdXQyJGZpcmVuYW1lKSwgbWluKSkKCnBlYWtfZGF5MT1zdWJzZXQocGVha19kYXkxLHggPCA1NikKcGVha19kYXkyPXN1YnNldChwZWFrX2RheTIseCA8IDU2KQpoaXN0LmEgPWhpc3QocGVha19kYXkxJHgsYnJlYWtzID1jKDA6NTUpLHBsb3Q9RikKaGlzdC5iID1oaXN0KHBlYWtfZGF5MiR4LGJyZWFrcyA9YygwOjU1KSxwbG90PUYpCmZnID0gcmJpbmQoaGlzdC5hJGNvdW50cyxoaXN0LmIkY291bnRzKQoKcGRmKGZpbGU9Ii9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3Mvc3VwX2ZpZzVfdGltZTc1L21lZC5wZGYiLHdpZHRoPTcsaGVpZ2h0PTUpCmZyID0gYmFycGxvdChmZyx4bGFiPSJEYXlzIGFmdGVyIGlnbml0aW9uIix5bGFiPSJOdW1iZXIgb2YgZmlyZXMiLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zLCB4bGltPWMoMSw2NSksIHlsaW09YygwLDE1KSkKYXhpcygxLGMoMC43LDUuNSwxMS41LDE3LjUsMjMuNSwyOS41LDM1LjUsNDEuNSw0Ny41LDUzLjUsNTkuNSw2NS41KSxsYWJlbHM9YygxLDUsMTAsMTUsMjAsMjUsMzAsMzUsNDAsNDUsNTAsNTUpLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQpkZXYub2ZmKCkKCiMjIyMjIyMjICBub3J0aCBjYWwgICMjIyMjIyMjIyMjCm91dDEgPSBzdWJzZXQocmVzNzUsY2F1c2UgPT0gMSAgJiAocmVzNzUkZWNvMSA9PSA2IHwgcmVzNzUkZWNvMSA9PSA3KSkgICAjMT1saWdodG5pbmc7IDE0PXVua25vd247IDc9YXJzb24Kb3V0MiA9IHN1YnNldChyZXM3NSxjYXVzZSAhPTEgJiBjYXVzZSAhPSAxNCAgJiAocmVzNzUkZWNvMSA9PSA2IHwgcmVzNzUkZWNvMSA9PSA3KSkKcGVha19kYXkxID0gYXMuZGF0YS5mcmFtZShhZ2dyZWdhdGUob3V0MSRmaXJlX2RheSwgYnkgPSBsaXN0KG91dDEkZmlyZW5hbWUpLCBtaW4pKQpwZWFrX2RheTIgPSBhcy5kYXRhLmZyYW1lKGFnZ3JlZ2F0ZShvdXQyJGZpcmVfZGF5LCBieSA9IGxpc3Qob3V0MiRmaXJlbmFtZSksIG1pbikpCgpwZWFrX2RheTE9c3Vic2V0KHBlYWtfZGF5MSx4IDwgNTYpCnBlYWtfZGF5Mj1zdWJzZXQocGVha19kYXkyLHggPCA1NikKaGlzdC5hID1oaXN0KHBlYWtfZGF5MSR4LGJyZWFrcyA9YygwOjU1KSxwbG90PUYpCmhpc3QuYiA9aGlzdChwZWFrX2RheTIkeCxicmVha3MgPWMoMDo1NSkscGxvdD1GKQpmZyA9IHJiaW5kKGhpc3QuYSRjb3VudHMsaGlzdC5iJGNvdW50cykKCnBkZihmaWxlPSIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL3N1cF9maWc1X3RpbWU3NS9ub3J0aC5wZGYiLHdpZHRoPTcsaGVpZ2h0PTUpCmZyID0gYmFycGxvdChmZyx4bGFiPSJEYXlzIGFmdGVyIGlnbml0aW9uIix5bGFiPSJOdW1iZXIgb2YgZmlyZXMiLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zLCB4bGltPWMoMSw2NSksIHlsaW09YygwLDE1KSkKYXhpcygxLGMoMC43LDUuNSwxMS41LDE3LjUsMjMuNSwyOS41LDM1LjUsNDEuNSw0Ny41LDUzLjUsNTkuNSw2NS41KSxsYWJlbHM9YygxLDUsMTAsMTUsMjAsMjUsMzAsMzUsNDAsNDUsNTAsNTUpLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQpkZXYub2ZmKCkKCiMjIyMjIyMjICBtZWRpdGVyYW5lYW4gIFNVTU1FUiAjIyMjIyMjIyMjIwpvdXQxID0gc3Vic2V0KHJlczc1LGNhdXNlID09IDEgJiByZXM3NSRlY28xID09IDExICYgKCByZXM3NSRtb250aCA8PTggJiByZXM3NSRtb250aCA+NSApKSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgpvdXQyID0gc3Vic2V0KHJlczc1LGNhdXNlICE9MSAmIGNhdXNlICE9IDE0ICYgcmVzNzUkZWNvMSA9PSAxMSAmICggcmVzNzUkbW9udGggPD04ICYgcmVzNzUkbW9udGggPjUgKSkKcGVha19kYXkxID0gYXMuZGF0YS5mcmFtZShhZ2dyZWdhdGUob3V0MSRmaXJlX2RheSwgYnkgPSBsaXN0KG91dDEkZmlyZW5hbWUpLCBtaW4pKQpwZWFrX2RheTIgPSBhcy5kYXRhLmZyYW1lKGFnZ3JlZ2F0ZShvdXQyJGZpcmVfZGF5LCBieSA9IGxpc3Qob3V0MiRmaXJlbmFtZSksIG1pbikpCgpwZWFrX2RheTE9c3Vic2V0KHBlYWtfZGF5MSx4IDwgNTYpCnBlYWtfZGF5Mj1zdWJzZXQocGVha19kYXkyLHggPCA1NikKaGlzdC5hID1oaXN0KHBlYWtfZGF5MSR4LGJyZWFrcyA9YygwOjU1KSxwbG90PUYpCmhpc3QuYiA9aGlzdChwZWFrX2RheTIkeCxicmVha3MgPWMoMDo1NSkscGxvdD1GKQpmZyA9IHJiaW5kKGhpc3QuYSRjb3VudHMsaGlzdC5iJGNvdW50cykKCnBkZihmaWxlPSIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL3N1cF9maWc1X3RpbWU3NS9tZWRfc3VtbWVyLnBkZiIsd2lkdGg9NyxoZWlnaHQ9NSkKZnIgPSBiYXJwbG90KGZnLHhsYWI9IkRheXMgYWZ0ZXIgaWduaXRpb24iLHlsYWI9Ik51bWJlciBvZiBmaXJlcyIsY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMsIHhsaW09YygxLDY1KSwgeWxpbT1jKDAsMTApKQpheGlzKDEsYygwLjcsNS41LDExLjUsMTcuNSwyMy41LDI5LjUsMzUuNSw0MS41LDQ3LjUsNTMuNSw1OS41LDY1LjUpLGxhYmVscz1jKDEsNSwxMCwxNSwyMCwyNSwzMCwzNSw0MCw0NSw1MCw1NSksY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCmRldi5vZmYoKQoKIyMjIyMjIyMgIG5vcnRoIGNhbCAgc3VtbWVyICMjIyMjIyMjIyMjCm91dDEgPSBzdWJzZXQocmVzNzUsY2F1c2UgPT0gMSAgJiAocmVzNzUkZWNvMSA9PSA2IHwgcmVzNzUkZWNvMSA9PSA3KSYgKCByZXM3NSRtb250aCA8PTggJiByZXM3NSRtb250aCA+NSApKSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgpvdXQyID0gc3Vic2V0KHJlczc1LGNhdXNlICE9MSAmIGNhdXNlICE9IDE0ICAmIChyZXM3NSRlY28xID09IDYgfCByZXM3NSRlY28xID09IDcpJiAoIHJlczc1JG1vbnRoIDw9OCAmIHJlczc1JG1vbnRoID41ICkpCnBlYWtfZGF5MSA9IGFzLmRhdGEuZnJhbWUoYWdncmVnYXRlKG91dDEkZmlyZV9kYXksIGJ5ID0gbGlzdChvdXQxJGZpcmVuYW1lKSwgbWluKSkKcGVha19kYXkyID0gYXMuZGF0YS5mcmFtZShhZ2dyZWdhdGUob3V0MiRmaXJlX2RheSwgYnkgPSBsaXN0KG91dDIkZmlyZW5hbWUpLCBtaW4pKQoKcGVha19kYXkxPXN1YnNldChwZWFrX2RheTEseCA8IDU2KQpwZWFrX2RheTI9c3Vic2V0KHBlYWtfZGF5Mix4IDwgNTYpCmhpc3QuYSA9aGlzdChwZWFrX2RheTEkeCxicmVha3MgPWMoMDo1NSkscGxvdD1GKQpoaXN0LmIgPWhpc3QocGVha19kYXkyJHgsYnJlYWtzID1jKDA6NTUpLHBsb3Q9RikKZmcgPSByYmluZChoaXN0LmEkY291bnRzLGhpc3QuYiRjb3VudHMpCgpwZGYoZmlsZT0iL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9zdXBfZmlnNV90aW1lNzUvbm9ydGhfc3VtbWVyLnBkZiIsd2lkdGg9NyxoZWlnaHQ9NSkKZnIgPSBiYXJwbG90KGZnLHhsYWI9IkRheXMgYWZ0ZXIgaWduaXRpb24iLHlsYWI9Ik51bWJlciBvZiBmaXJlcyIsY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMsIHhsaW09YygxLDY1KSwgeWxpbT1jKDAsMTIpKQpheGlzKDEsYygwLjcsNS41LDExLjUsMTcuNSwyMy41LDI5LjUsMzUuNSw0MS41LDQ3LjUsNTMuNSw1OS41LDY1LjUpLGxhYmVscz1jKDEsNSwxMCwxNSwyMCwyNSwzMCwzNSw0MCw0NSw1MCw1NSksY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCmRldi5vZmYoKQoKIyMjIyMjIyMgIG1lZGl0ZXJhbmVhbiAgYXV0dW1uIyMjIyMjIyMjIyMKb3V0MSA9IHN1YnNldChyZXM3NSxjYXVzZSA9PSAxICYgcmVzNzUkZWNvMSA9PSAxMSAmICggcmVzNzUkbW9udGggPjgpKSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgpvdXQyID0gc3Vic2V0KHJlczc1LGNhdXNlICE9MSAmIGNhdXNlICE9IDE0ICYgcmVzNzUkZWNvMSA9PSAxMSAmICggcmVzNzUkbW9udGggPjggKSkKI3BlYWtfZGF5MSA9IGFzLmRhdGEuZnJhbWUoYWdncmVnYXRlKG91dDEkZmlyZV9kYXksIGJ5ID0gbGlzdChvdXQxJGZpcmVuYW1lKSwgbWluKSkKcGVha19kYXkyID0gYXMuZGF0YS5mcmFtZShhZ2dyZWdhdGUob3V0MiRmaXJlX2RheSwgYnkgPSBsaXN0KG91dDIkZmlyZW5hbWUpLCBtaW4pKQoKI3BlYWtfZGF5MT1zdWJzZXQocGVha19kYXkxLHggPCA1NikKcGVha19kYXkyPXN1YnNldChwZWFrX2RheTIseCA8IDU2KQojaGlzdC5hID1oaXN0KHBlYWtfZGF5MSR4LGJyZWFrcyA9YygwOjU1KSxwbG90PUYpCmhpc3QuYiA9aGlzdChwZWFrX2RheTIkeCxicmVha3MgPWMoMDo1NSkscGxvdD1GKQpmZyA9IHJiaW5kKDAsaGlzdC5iJGNvdW50cykKCnBkZihmaWxlPSIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL3N1cF9maWc1X3RpbWU3NS9tZWRfYXV0dW1uLnBkZiIsd2lkdGg9NyxoZWlnaHQ9NSkKZnIgPSBiYXJwbG90KGZnLHhsYWI9IkRheXMgYWZ0ZXIgaWduaXRpb24iLHlsYWI9Ik51bWJlciBvZiBmaXJlcyIsY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMsIHhsaW09YygxLDY1KSwgeWxpbT1jKDAsNSkpCmF4aXMoMSxjKDAuNyw1LjUsMTEuNSwxNy41LDIzLjUsMjkuNSwzNS41LDQxLjUsNDcuNSw1My41LDU5LjUsNjUuNSksbGFiZWxzPWMoMSw1LDEwLDE1LDIwLDI1LDMwLDM1LDQwLDQ1LDUwLDU1KSxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKZGV2Lm9mZigpCgojIyMjIyMjIyAgbm9ydGggY2FsICBhdXR1bW4gIyMjIyMjIyMjIyMKb3V0MSA9IHN1YnNldChyZXM3NSxjYXVzZSA9PSAxICAmIChyZXM3NSRlY28xID09IDYgfCByZXM3NSRlY28xID09IDcpJiAoIHJlczc1JG1vbnRoID44KSkgICAjMT1saWdodG5pbmc7IDE0PXVua25vd247IDc9YXJzb24Kb3V0MiA9IHN1YnNldChyZXM3NSxjYXVzZSAhPTEgJiBjYXVzZSAhPSAxNCAgJiAocmVzNzUkZWNvMSA9PSA2IHwgcmVzNzUkZWNvMSA9PSA3KSYgKCByZXM3NSRtb250aCA+OCApKQpwZWFrX2RheTEgPSBhcy5kYXRhLmZyYW1lKGFnZ3JlZ2F0ZShvdXQxJGZpcmVfZGF5LCBieSA9IGxpc3Qob3V0MSRmaXJlbmFtZSksIG1pbikpCnBlYWtfZGF5MiA9IGFzLmRhdGEuZnJhbWUoYWdncmVnYXRlKG91dDIkZmlyZV9kYXksIGJ5ID0gbGlzdChvdXQyJGZpcmVuYW1lKSwgbWluKSkKCnBlYWtfZGF5MT1zdWJzZXQocGVha19kYXkxLHggPCA1NikKcGVha19kYXkyPXN1YnNldChwZWFrX2RheTIseCA8IDU2KQpoaXN0LmEgPWhpc3QocGVha19kYXkxJHgsYnJlYWtzID1jKDA6NTUpLHBsb3Q9RikKaGlzdC5iID1oaXN0KHBlYWtfZGF5MiR4LGJyZWFrcyA9YygwOjU1KSxwbG90PUYpCmZnID0gcmJpbmQoaGlzdC5hJGNvdW50cyxoaXN0LmIkY291bnRzKQoKcGRmKGZpbGU9Ii9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3Mvc3VwX2ZpZzVfdGltZTc1L25vcnRoX2F1dHVtbi5wZGYiLHdpZHRoPTcsaGVpZ2h0PTUpCmZyID0gYmFycGxvdChmZyx4bGFiPSJEYXlzIGFmdGVyIGlnbml0aW9uIix5bGFiPSJOdW1iZXIgb2YgZmlyZXMiLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zLCB4bGltPWMoMSw2NSksIHlsaW09YygwLDUpKQpheGlzKDEsYygwLjcsNS41LDExLjUsMTcuNSwyMy41LDI5LjUsMzUuNSw0MS41LDQ3LjUsNTMuNSw1OS41LDY1LjUpLGxhYmVscz1jKDEsNSwxMCwxNSwyMCwyNSwzMCwzNSw0MCw0NSw1MCw1NSksY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCmRldi5vZmYoKQpgYGAKCgpgYGB7cn0KCnJlcz1yZXNbcmVzJHJvc19rbT4wLF0KcmVzX2YgPSByZXNbcmVzJG1heF9sYW5kID09IDEsXQpyZXNfcCA9IHJlc1tyZXMkbWF4X2xhbmQgIT0gMSxdCgojanVzdCBzaG93IHRoZSBwbG90IGhlcmUKcGxvdChyZXNfZiRtZWFuX2ZycH5yZXNfZiRyb3Nfa20sbG9nPSJ4eSIseGxpbT1jKDAuMDA1LDMwKSx5bGltPWMoMC4xLDE4MCkseGF4dD0ibiIseWxhYj0ibWVhbiBGUlAgKE1XKSIseGxhYj0iUmF0ZS1vZi1TcHJlYWQgKGttL2RheSkiLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMyxjb2w9ImRhcmtncmVlbiIpCgptYXJrcz1jKDAuMDEsMC4xLDEsMTApCm1hcmtzMT1jKDAuMSwwLjUsNSw1MCkKdGlmZigiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9maWdfRlJQX3Jvc192My50aWYiLCB3aWR0aCA9IDUsIGhlaWdodCA9IDUsIHVuaXRzID0gJ2luJywgcmVzID0gMzAwKQpwbG90KHJlc19mJG1lYW5fZnJwfnJlc19mJHJvc19rbSxsb2c9Inh5Iix4bGltPWMoMC4wMDUsMzApLHlsaW09YygwLjEsMTgwKSx4YXh0PSJuIix5YXh0PSJuIix5bGFiPSJtZWFuIEZSUCAoTVcpIix4bGFiPSJSYXRlLW9mLVNwcmVhZCAoa20vZGF5KSIsIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zLGNvbD0iZGFya2dyZWVuIikKcG9pbnRzKHJlc19wJG1lYW5fZnJwfnJlc19wJHJvc19rbSxjb2w9Im9yYW5nZSIpCmF4aXMoMSxhdD1tYXJrcyxsYWJlbHM9bWFya3MsY2V4LmF4aXM9MS40ICkKYXhpcygyLGF0PW1hcmtzMSxsYWJlbHM9bWFya3MxLGNleC5heGlzPTEuNCApCmxlZ2VuZCggeD0idG9wbGVmdCIsbGVnZW5kPWMoIkZvcmVzdCIsIkdyYXNzICYgc2hydWIiKSxjb2w9YygiZGFya2dyZWVuIiwib3JhbmdlIiksY2V4PTEuMixwY2g9MSxidHkgPSAibiIpCmRldi5vZmYoKQoKCgpgYGAKCgojIyMjIyMjIyAgZGlmZmVyZW5jZSBpbiBmaXJlIHNpemUgZm9yIGZpcnN0IDUgZGF5cyBhY3Jvc3MgY2FsaWZvcm5pYSBhbmQgYm90aCBlY29zeXN0ZW1zIAoKYGBge3J9CiAKcmVzJHJvczEgPSByZXMkbWF4X3JvcysxCgoKb3V0MSA9IHN1YnNldChyZXMsY2F1c2UgPT0gMSApICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCm91dDIgPSBzdWJzZXQocmVzLGNhdXNlICE9MSAmIGNhdXNlICE9IDE0ICkKCmh1bTEgPSBvdXQyW291dDIkZmlyZV9kYXkgPT0xLF0KaHVtMiA9IG91dDJbb3V0MiRmaXJlX2RheSA9PTIsXQpodW0zID0gb3V0MltvdXQyJGZpcmVfZGF5ID09MyxdCmh1bTQgPSBvdXQyW291dDIkZmlyZV9kYXkgPT00LF0KaHVtNSA9IG91dDJbb3V0MiRmaXJlX2RheSA9PTUsXQpsaWcxID0gb3V0MVtvdXQxJGZpcmVfZGF5ID09MSxdCmxpZzIgPSBvdXQxW291dDEkZmlyZV9kYXkgPT0yLF0KbGlnMyA9IG91dDFbb3V0MSRmaXJlX2RheSA9PTMsXQpsaWc0ID0gb3V0MVtvdXQxJGZpcmVfZGF5ID09NCxdCmxpZzUgPSBvdXQxW291dDEkZmlyZV9kYXkgPT01LF0KbWVhbihodW0xJGdyb3d0aCkKbWVhbihodW0yJGdyb3d0aCkKbWVhbihodW0zJGdyb3d0aCkKbWVhbihodW00JGdyb3d0aCkKbWVhbihodW01JGdyb3d0aCkKbWVhbihsaWcxJGdyb3d0aCkKbWVhbihsaWcyJGdyb3d0aCkKbWVhbihsaWczJGdyb3d0aCkKbWVhbihsaWc0JGdyb3d0aCkKbWVhbihsaWc1JGdyb3d0aCkKdC50ZXN0KGxvZzEwKGh1bTEkZ3Jvd3RoKSxsb2cxMChsaWcxJGdyb3d0aCkpCnQudGVzdChsb2cxMChodW0yJGdyb3d0aCksbG9nMTAobGlnMiRncm93dGgpKQp0LnRlc3QobG9nMTAoaHVtMyRncm93dGgpLGxvZzEwKGxpZzMkZ3Jvd3RoKSkKdC50ZXN0KGxvZzEwKGh1bTQkZ3Jvd3RoKSxsb2cxMChsaWc0JGdyb3d0aCkpCnQudGVzdChsb2cxMChodW01JGdyb3d0aCksbG9nMTAobGlnNSRncm93dGgpKQoKaHVtMSA9IG91dDJbb3V0MiRmaXJlX2RheSA9PTEgJiBvdXQyJGVjbzE9PTYsXQpodW0yID0gb3V0MltvdXQyJGZpcmVfZGF5ID09MiAmIG91dDIkZWNvMT09NixdCmh1bTMgPSBvdXQyW291dDIkZmlyZV9kYXkgPT0zICYgb3V0MiRlY28xPT02LF0KaHVtNCA9IG91dDJbb3V0MiRmaXJlX2RheSA9PTQgJiBvdXQyJGVjbzE9PTYsXQpodW01ID0gb3V0MltvdXQyJGZpcmVfZGF5ID09NSAmIG91dDIkZWNvMT09NixdCmxpZzEgPSBvdXQxW291dDEkZmlyZV9kYXkgPT0xICYgb3V0MSRlY28xPT02LF0KbGlnMiA9IG91dDFbb3V0MSRmaXJlX2RheSA9PTIgJiBvdXQxJGVjbzE9PTYsXQpsaWczID0gb3V0MVtvdXQxJGZpcmVfZGF5ID09MyAmIG91dDEkZWNvMT09NixdCmxpZzQgPSBvdXQxW291dDEkZmlyZV9kYXkgPT00ICYgb3V0MSRlY28xPT02LF0KbGlnNSA9IG91dDFbb3V0MSRmaXJlX2RheSA9PTUgJiBvdXQxJGVjbzE9PTYsXQptZWFuKGh1bTEkZ3Jvd3RoKQptZWFuKGh1bTIkZ3Jvd3RoKQptZWFuKGh1bTMkZ3Jvd3RoKQptZWFuKGh1bTQkZ3Jvd3RoKQptZWFuKGh1bTUkZ3Jvd3RoKQptZWFuKGxpZzEkZ3Jvd3RoLCBuYS5ybT1UKQptZWFuKGxpZzIkZ3Jvd3RoLCBuYS5ybT1UKQptZWFuKGxpZzMkZ3Jvd3RoLCBuYS5ybT1UKQptZWFuKGxpZzQkZ3Jvd3RoLCBuYS5ybT1UKQptZWFuKGxpZzUkZ3Jvd3RoLCBuYS5ybT1UKQp0LnRlc3QobG9nMTAoaHVtMSRncm93dGgpLGxvZzEwKGxpZzEkZ3Jvd3RoKSkKdC50ZXN0KGxvZzEwKGh1bTIkZ3Jvd3RoKSxsb2cxMChsaWcyJGdyb3d0aCkpCnQudGVzdChsb2cxMChodW0zJGdyb3d0aCksbG9nMTAobGlnMyRncm93dGgpKQp0LnRlc3QobG9nMTAoaHVtNCRncm93dGgpLGxvZzEwKGxpZzQkZ3Jvd3RoKSkKdC50ZXN0KGxvZzEwKGh1bTUkZ3Jvd3RoKSxsb2cxMChsaWc1JGdyb3d0aCkpCgpodW0xID0gb3V0MltvdXQyJGZpcmVfZGF5ID09MSAmIG91dDIkZWNvMT09MTEsXQpodW0yID0gb3V0MltvdXQyJGZpcmVfZGF5ID09MiAmIG91dDIkZWNvMT09MTEsXQpodW0zID0gb3V0MltvdXQyJGZpcmVfZGF5ID09MyAmIG91dDIkZWNvMT09MTEsXQpodW00ID0gb3V0MltvdXQyJGZpcmVfZGF5ID09NCAmIG91dDIkZWNvMT09MTEsXQpodW01ID0gb3V0MltvdXQyJGZpcmVfZGF5ID09NSAmIG91dDIkZWNvMT09MTEsXQpsaWcxID0gb3V0MVtvdXQxJGZpcmVfZGF5ID09MSAmIG91dDEkZWNvMT09MTEsXQpsaWcyID0gb3V0MVtvdXQxJGZpcmVfZGF5ID09MiAmIG91dDEkZWNvMT09MTEsXQpsaWczID0gb3V0MVtvdXQxJGZpcmVfZGF5ID09MyAmIG91dDEkZWNvMT09MTEsXQpsaWc0ID0gb3V0MVtvdXQxJGZpcmVfZGF5ID09NCAmIG91dDEkZWNvMT09MTEsXQpsaWc1ID0gb3V0MVtvdXQxJGZpcmVfZGF5ID09NSAmIG91dDEkZWNvMT09MTEsXQptZWFuKGh1bTEkZ3Jvd3RoKQptZWFuKGh1bTIkZ3Jvd3RoKQptZWFuKGh1bTMkZ3Jvd3RoKQptZWFuKGh1bTQkZ3Jvd3RoKQptZWFuKGh1bTUkZ3Jvd3RoKQptZWFuKGxpZzEkZ3Jvd3RoLCBuYS5ybT1UKQptZWFuKGxpZzIkZ3Jvd3RoLCBuYS5ybT1UKQptZWFuKGxpZzMkZ3Jvd3RoLCBuYS5ybT1UKQptZWFuKGxpZzQkZ3Jvd3RoLCBuYS5ybT1UKQptZWFuKGxpZzUkZ3Jvd3RoLCBuYS5ybT1UKQojdC50ZXN0KGxvZzEwKGh1bTEkZ3Jvd3RoKSxsb2cxMChsaWcxJGdyb3d0aCkpCiN0LnRlc3QobG9nMTAoaHVtMiRncm93dGgpLGxvZzEwKGxpZzIkZ3Jvd3RoKSkKdC50ZXN0KGxvZzEwKGh1bTMkZ3Jvd3RoKSxsb2cxMChsaWczJGdyb3d0aCkpCnQudGVzdChsb2cxMChodW00JGdyb3d0aCksbG9nMTAobGlnNCRncm93dGgpKQp0LnRlc3QobG9nMTAoaHVtNSRncm93dGgpLGxvZzEwKGxpZzUkZ3Jvd3RoKSkKCgpgYGAKCmBgYHtyfQoKb3V0MSA9IHN1YnNldChyZXMsY2F1c2UgPT0gMSApICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCm91dDIgPSBzdWJzZXQocmVzLGNhdXNlICE9MSAmIGNhdXNlICE9IDE0ICkKCm1lYW4ob3V0MSRyb3Nfa20sbmEucm09VCkKbWVhbihvdXQyJHJvc19rbSxuYS5ybT1UKQoKaGlzdC5hID1oaXN0KG91dDEkcm9zX2ttLGJyZWFrcyA9YygwLDAuMDEsMC4wNSwwLjEsMC4yNSwwLjUsMSwyLDUsMTAsMjAsMzApLHBsb3Q9RikKaGlzdC5iID1oaXN0KG91dDIkcm9zX2ttLGJyZWFrcyA9YygwLDAuMDEsMC4wNSwwLjEsMC4yNSwwLjUsMSwyLDUsMTAsMjAsMzApLHBsb3Q9RikKZmcgPSByYmluZChoaXN0LmEkY291bnRzLGhpc3QuYiRjb3VudHMpCgpmciA9IGJhcnBsb3QoZmcsIGJlc2lkZT1UUlVFLHhsYWI9IlJhdGUtb2YtU3ByZWFkIChrbS9kYXkpIix5bGFiPSJOdW1iZXIgb2YgZmlyZSBkYXlzIixjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKYXhpcygxLGF0PWMoMC41LDMuNSw2LjUsOS41LDEyLjUsMTUuNSwxOC41LDIxLjUsMjQuNSwyNy41LDMwLjUsMzMuNSksbGFiZWxzPWhpc3QuYSRicmVha3MsY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCgpvdXQxID0gc3Vic2V0KHJlcyxjYXVzZSA9PSAxICYgKGVjbzEgPT0gNiB8IGVjbzEgPT0gNykpICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCm91dDIgPSBzdWJzZXQocmVzLGNhdXNlICE9MSAmIGNhdXNlICE9IDE0ICYgKGVjbzEgPT0gNiB8IGVjbzEgPT0gNykpCgpoaXN0LmEgPWhpc3Qob3V0MSRyb3Nfa20sYnJlYWtzID1jKDAsMC4wMSwwLjA1LDAuMSwwLjI1LDAuNSwxLDIsNSwxMCwyMCwzMCkscGxvdD1GKQpoaXN0LmIgPWhpc3Qob3V0MiRyb3Nfa20sYnJlYWtzID1jKDAsMC4wMSwwLjA1LDAuMSwwLjI1LDAuNSwxLDIsNSwxMCwyMCwzMCkscGxvdD1GKQpmZyA9IHJiaW5kKGhpc3QuYSRjb3VudHMsaGlzdC5iJGNvdW50cykKCmZyID0gYmFycGxvdChmZywgYmVzaWRlPVRSVUUseGxhYj0iUmF0ZS1vZi1TcHJlYWQgKGttL2RheSkiLHlsYWI9Ik51bWJlciBvZiBmaXJlIGRheXMiLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpheGlzKDEsYXQ9YygwLjUsMy41LDYuNSw5LjUsMTIuNSwxNS41LDE4LjUsMjEuNSwyNC41LDI3LjUsMzAuNSwzMy41KSxsYWJlbHM9aGlzdC5hJGJyZWFrcyxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKCm91dDEgPSBzdWJzZXQocmVzLGNhdXNlID09IDEgJiBlY28xID09IDExKSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgpvdXQyID0gc3Vic2V0KHJlcyxjYXVzZSAhPTEgJiBjYXVzZSAhPSAxNCAmIGVjbzEgPT0gMTEpCgpoaXN0LmEgPWhpc3Qob3V0MSRyb3Nfa20sYnJlYWtzID1jKDAsMC4wMSwwLjA1LDAuMSwwLjI1LDAuNSwxLDIsNSwxMCwyMCwzMCkscGxvdD1GKQpoaXN0LmIgPWhpc3Qob3V0MiRyb3Nfa20sYnJlYWtzID1jKDAsMC4wMSwwLjA1LDAuMSwwLjI1LDAuNSwxLDIsNSwxMCwyMCwzMCkscGxvdD1GKQpmZyA9IHJiaW5kKGhpc3QuYSRjb3VudHMsaGlzdC5iJGNvdW50cykKCmZyID0gYmFycGxvdChmZywgYmVzaWRlPVRSVUUseGxhYj0iUmF0ZS1vZi1TcHJlYWQgKGttL2RheSkiLHlsYWI9Ik51bWJlciBvZiBmaXJlIGRheXMiLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpheGlzKDEsYXQ9YygwLjUsMy41LDYuNSw5LjUsMTIuNSwxNS41LDE4LjUsMjEuNSwyNC41LDI3LjUsMzAuNSwzMy41KSxsYWJlbHM9aGlzdC5hJGJyZWFrcyxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKCiMjIyMjIyMjIyMjIyBhdXR1bW4gbm9ydGhlcm4gY2FsaWZvcm5pYQpvdXQxID0gc3Vic2V0KHJlcyxjYXVzZSA9PSAxICYgKGVjbzEgPT0gNiB8IGVjbzEgPT0gNykgJiAobW9udGggPiA5KSkgICAjMT1saWdodG5pbmc7IDE0PXVua25vd247IDc9YXJzb24Kb3V0MiA9IHN1YnNldChyZXMsY2F1c2UgIT0xICYgY2F1c2UgIT0gMTQgJiAoZWNvMSA9PSA2IHwgZWNvMSA9PSA3KSAmIChtb250aCA+IDkpKQoKaGlzdC5hID1oaXN0KG91dDEkcm9zX2ttLGJyZWFrcyA9YygwLDAuMDEsMC4wNSwwLjEsMC4yNSwwLjUsMSwyLDUsMTAsMjAsMzApLHBsb3Q9RikKaGlzdC5iID1oaXN0KG91dDIkcm9zX2ttLGJyZWFrcyA9YygwLDAuMDEsMC4wNSwwLjEsMC4yNSwwLjUsMSwyLDUsMTAsMjAsMzApLHBsb3Q9RikKZmcgPSByYmluZChoaXN0LmEkY291bnRzLGhpc3QuYiRjb3VudHMpCgpmciA9IGJhcnBsb3QoZmcsIGJlc2lkZT1UUlVFLHhsYWI9IlJhdGUtb2YtU3ByZWFkIChrbS9kYXkpIix5bGFiPSJOdW1iZXIgb2YgZmlyZSBkYXlzIixjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKYXhpcygxLGF0PWMoMC41LDMuNSw2LjUsOS41LDEyLjUsMTUuNSwxOC41LDIxLjUsMjQuNSwyNy41LDMwLjUsMzMuNSksbGFiZWxzPWhpc3QuYSRicmVha3MsY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCgojIyMjIyMjIyMjIyMgYXV0dW1uIG1lZGl0ZXJlYW4gY2FsaWZvcm5pYQpvdXQxID0gc3Vic2V0KHJlcyxjYXVzZSA9PSAxICYgZWNvMSA9PSAxMSAmIChtb250aCA+IDkpKSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgpvdXQyID0gc3Vic2V0KHJlcyxjYXVzZSAhPTEgJiBjYXVzZSAhPSAxNCAmIGVjbzEgPT0gMTEgJiAobW9udGggPiA5KSkKCmhpc3QuYSA9aGlzdChvdXQxJHJvc19rbSxicmVha3MgPWMoMCwwLjAxLDAuMDUsMC4xLDAuMjUsMC41LDEsMiw1LDEwLDIwLDMwKSxwbG90PUYpCmhpc3QuYiA9aGlzdChvdXQyJHJvc19rbSxicmVha3MgPWMoMCwwLjAxLDAuMDUsMC4xLDAuMjUsMC41LDEsMiw1LDEwLDIwLDMwKSxwbG90PUYpCmZnID0gcmJpbmQoaGlzdC5hJGNvdW50cyxoaXN0LmIkY291bnRzKQoKZnIgPSBiYXJwbG90KGZnLCBiZXNpZGU9VFJVRSx4bGFiPSJSYXRlLW9mLVNwcmVhZCAoa20vZGF5KSIseWxhYj0iTnVtYmVyIG9mIGZpcmUgZGF5cyIsY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCmF4aXMoMSxhdD1jKDAuNSwzLjUsNi41LDkuNSwxMi41LDE1LjUsMTguNSwyMS41LDI0LjUsMjcuNSwzMC41LDMzLjUpLGxhYmVscz1oaXN0LmEkYnJlYWtzLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQoKIyMjIyMjIyMjIyMjIHN1bW1lciBub3J0aGVybiBjYWxpZm9ybmlhCm91dDEgPSBzdWJzZXQocmVzLGNhdXNlID09IDEgJiAoZWNvMSA9PSA2IHwgZWNvMSA9PSA3KSAmIChtb250aCA+IDUgJiBtb250aDwxMCkpICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCm91dDIgPSBzdWJzZXQocmVzLGNhdXNlICE9MSAmIGNhdXNlICE9IDE0ICYgKGVjbzEgPT0gNiB8IGVjbzEgPT0gNykgJiAobW9udGggPiA1ICYgbW9udGg8MTApKQoKaGlzdC5hID1oaXN0KG91dDEkcm9zX2ttLGJyZWFrcyA9YygwLDAuMDEsMC4wNSwwLjEsMC4yNSwwLjUsMSwyLDUsMTAsMjAsMzApLHBsb3Q9RikKaGlzdC5iID1oaXN0KG91dDIkcm9zX2ttLGJyZWFrcyA9YygwLDAuMDEsMC4wNSwwLjEsMC4yNSwwLjUsMSwyLDUsMTAsMjAsMzApLHBsb3Q9RikKZmcgPSByYmluZChoaXN0LmEkY291bnRzLGhpc3QuYiRjb3VudHMpCgpmciA9IGJhcnBsb3QoZmcsIGJlc2lkZT1UUlVFLHhsYWI9IlJhdGUtb2YtU3ByZWFkIChrbS9kYXkpIix5bGFiPSJOdW1iZXIgb2YgZmlyZSBkYXlzIixjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKYXhpcygxLGF0PWMoMC41LDMuNSw2LjUsOS41LDEyLjUsMTUuNSwxOC41LDIxLjUsMjQuNSwyNy41LDMwLjUsMzMuNSksbGFiZWxzPWhpc3QuYSRicmVha3MsY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCgojIyMjIyMjIyMjIyMgc3VtbWVyIG1lZGl0ZXJlYW4gY2FsaWZvcm5pYQpvdXQxID0gc3Vic2V0KHJlcyxjYXVzZSA9PSAxICYgZWNvMSA9PSAxMSAgJiAobW9udGggPiA1ICYgbW9udGg8MTApKSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgpvdXQyID0gc3Vic2V0KHJlcyxjYXVzZSAhPTEgJiBjYXVzZSAhPSAxNCAmIGVjbzEgPT0gMTEgICYgKG1vbnRoID4gNSAmIG1vbnRoPDEwKSkKCmhpc3QuYSA9aGlzdChvdXQxJHJvc19rbSxicmVha3MgPWMoMCwwLjAxLDAuMDUsMC4xLDAuMjUsMC41LDEsMiw1LDEwLDIwLDMwKSxwbG90PUYpCmhpc3QuYiA9aGlzdChvdXQyJHJvc19rbSxicmVha3MgPWMoMCwwLjAxLDAuMDUsMC4xLDAuMjUsMC41LDEsMiw1LDEwLDIwLDMwKSxwbG90PUYpCmZnID0gcmJpbmQoaGlzdC5hJGNvdW50cyxoaXN0LmIkY291bnRzKQoKZnIgPSBiYXJwbG90KGZnLCBiZXNpZGU9VFJVRSx4bGFiPSJSYXRlLW9mLVNwcmVhZCAoa20vZGF5KSIseWxhYj0iTnVtYmVyIG9mIGZpcmUgZGF5cyIsY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCmF4aXMoMSxhdD1jKDAuNSwzLjUsNi41LDkuNSwxMi41LDE1LjUsMTguNSwyMS41LDI0LjUsMjcuNSwzMC41LDMzLjUpLGxhYmVscz1oaXN0LmEkYnJlYWtzLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQoKYGBgCgpgYGB7cn0KCm91dDEgPSBzdWJzZXQocmVzLGNhdXNlID09IDEgKSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgpvdXQyID0gc3Vic2V0KHJlcyxjYXVzZSAhPTEgJiBjYXVzZSAhPSAxNCApCgptZWFuKG91dDEkcm9zX2ttLG5hLnJtPVQpCm1lYW4ob3V0MiRyb3Nfa20sbmEucm09VCkKIzAsMC4yNSwwLjUsMSwyLDMsNSw3LDEwLDIwLDMwCmhpc3QuYSA9aGlzdChvdXQxJHJvc19rbSxicmVha3MgPWMoMCwwLjUsMSwyLDMsNSw3LDEwLDIwLDMwKSxwbG90PUYpCmhpc3QuYiA9aGlzdChvdXQyJHJvc19rbSxicmVha3MgPWMoMCwwLjUsMSwyLDMsNSw3LDEwLDIwLDMwKSxwbG90PUYpCmZnID0gcmJpbmQoaGlzdC5hJGNvdW50cyxoaXN0LmIkY291bnRzKQpkZW5zID0gcmJpbmQoKGhpc3QuYSRjb3VudHMvKHN1bShoaXN0LmEkY291bnRzKSkpKjEwMCwoaGlzdC5iJGNvdW50cy8oc3VtKGhpc3QuYiRjb3VudHMpKSkqMTAwKQoKZnIgPSBiYXJwbG90KGZnLCBiZXNpZGU9VFJVRSx4bGFiPSJSYXRlLW9mLVNwcmVhZCAoa20vZGF5KSIseWxhYj0iTnVtYmVyIG9mIGZpcmUgZGF5cyIsY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCmF4aXMoMSxhdD1jKDAuNSwzLjUsNi41LDkuNSwxMi41LDE1LjUsMTguNSwyMS41LDI0LjUsMjcuNSksbGFiZWxzPWhpc3QuYSRicmVha3MsY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCgpmciA9IGJhcnBsb3QoZGVucywgYmVzaWRlPVRSVUUseGxhYj1leHByZXNzaW9uKCdSYXRlLW9mLVNwcmVhZCAoa20gZCdeLTEqJyknKSx5bGFiPSIlIGZpcmUgZGF5cyIseWxpbT1jKDAsNjApLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpheGlzKDEsYXQ9YygwLjUsMy41LDYuNSw5LjUsMTIuNSwxNS41LDE4LjUsMjEuNSwyNC41LDI3LjUpLGxhYmVscz1oaXN0LmEkYnJlYWtzLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQoKdGlmZigiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9maWd1cmUyX2ZyZXFfdjEudGlmIiwgd2lkdGggPSA2LCBoZWlnaHQgPSA1LCB1bml0cyA9ICdpbicsIHJlcyA9IDMwMCkKZnIgPSBiYXJwbG90KGRlbnMsIGJlc2lkZT1UUlVFLHhsYWI9ZXhwcmVzc2lvbignUmF0ZS1vZi1TcHJlYWQgKGttIGQnXi0xKicpJykseWxhYj0iJSBmaXJlIGRheXMiLHlsaW09YygwLDYwKSxjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKYXhpcygxLGF0PWMoMC41LDMuNSw2LjUsOS41LDEyLjUsMTUuNSwxOC41LDIxLjUsMjQuNSwyNy41KSxsYWJlbHM9aGlzdC5hJGJyZWFrcyxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKZGV2Lm9mZigpIAoKCiMjIyMjIyMjIyMjIyBhdXR1bW4gbm9ydGhlcm4gY2FsaWZvcm5pYQpvdXQxID0gc3Vic2V0KHJlcyxjYXVzZSA9PSAxICYgKGVjbzEgPT0gNiB8IGVjbzEgPT0gNykgJiAobW9udGggPiA5KSkgICAjMT1saWdodG5pbmc7IDE0PXVua25vd247IDc9YXJzb24Kb3V0MiA9IHN1YnNldChyZXMsY2F1c2UgIT0xICYgY2F1c2UgIT0gMTQgJiAoZWNvMSA9PSA2IHwgZWNvMSA9PSA3KSAmIChtb250aCA+IDkpKQoKaGlzdC5hID1oaXN0KG91dDEkcm9zX2ttLGJyZWFrcyA9YygwLDAuNSwxLDIsMyw1LDcsMTAsMjAsMzApLHBsb3Q9RikKaGlzdC5iID1oaXN0KG91dDIkcm9zX2ttLGJyZWFrcyA9YygwLDAuNSwxLDIsMyw1LDcsMTAsMjAsMzApLHBsb3Q9RikKZmcgPSByYmluZChoaXN0LmEkY291bnRzLGhpc3QuYiRjb3VudHMpCmRlbnMgPSByYmluZCgoaGlzdC5hJGNvdW50cy8oc3VtKGhpc3QuYSRjb3VudHMpKSkqMTAwLChoaXN0LmIkY291bnRzLyhzdW0oaGlzdC5iJGNvdW50cykpKSoxMDApCgpmciA9IGJhcnBsb3QoZmcsIGJlc2lkZT1UUlVFLHhsYWI9IlJhdGUtb2YtU3ByZWFkIChrbS9kYXkpIix5bGFiPSJOdW1iZXIgb2YgZmlyZSBkYXlzIixjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKYXhpcygxLGF0PWMoMC41LDMuNSw2LjUsOS41LDEyLjUsMTUuNSwxOC41LDIxLjUsMjQuNSwyNy41KSxsYWJlbHM9aGlzdC5hJGJyZWFrcyxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKCmZyID0gYmFycGxvdChkZW5zLCBiZXNpZGU9VFJVRSx4bGFiPSJSYXRlLW9mLVNwcmVhZCAoa20vZGF5KSIseWxhYj0iJSBmaXJlIGRheXMiLHlsaW09YygwLDgwKSxjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKYXhpcygxLGF0PWMoMC41LDMuNSw2LjUsOS41LDEyLjUsMTUuNSwxOC41LDIxLjUsMjQuNSwyNy41KSxsYWJlbHM9aGlzdC5hJGJyZWFrcyxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKCnRpZmYoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3MvUzRfZnJlcV9hdXR1bW5fbm9ydGhfdjEudGlmIiwgd2lkdGggPSA2LCBoZWlnaHQgPSA1LCB1bml0cyA9ICdpbicsIHJlcyA9IDMwMCkKZnIgPSBiYXJwbG90KGRlbnMsIGJlc2lkZT1UUlVFLHhsYWI9ZXhwcmVzc2lvbignUmF0ZS1vZi1TcHJlYWQgKGttIGQnXi0xKicpJykseWxhYj0iJSBmaXJlIGRheXMiLHlsaW09YygwLDgwKSxjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKYXhpcygxLGF0PWMoMC41LDMuNSw2LjUsOS41LDEyLjUsMTUuNSwxOC41LDIxLjUsMjQuNSwyNy41KSxsYWJlbHM9aGlzdC5hJGJyZWFrcyxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKZGV2Lm9mZigpIAoKIyMjIyMjIyMjIyMjIGF1dHVtbiBtZWRpdGVyZWFuIGNhbGlmb3JuaWEKb3V0MSA9IHN1YnNldChyZXMsY2F1c2UgPT0gMSAmIGVjbzEgPT0gMTEgJiAobW9udGggPiA5KSkgICAjMT1saWdodG5pbmc7IDE0PXVua25vd247IDc9YXJzb24Kb3V0MiA9IHN1YnNldChyZXMsY2F1c2UgIT0xICYgY2F1c2UgIT0gMTQgJiBlY28xID09IDExICYgKG1vbnRoID4gOSkpCgpoaXN0LmEgPWhpc3Qob3V0MSRyb3Nfa20sYnJlYWtzID1jKDAsMC41LDEsMiwzLDUsNywxMCwyMCwzMCkscGxvdD1GKQpoaXN0LmIgPWhpc3Qob3V0MiRyb3Nfa20sYnJlYWtzID1jKDAsMC41LDEsMiwzLDUsNywxMCwyMCwzMCkscGxvdD1GKQpmZyA9IHJiaW5kKGhpc3QuYSRjb3VudHMsaGlzdC5iJGNvdW50cykKZGVucyA9IHJiaW5kKChoaXN0LmEkY291bnRzLyhzdW0oaGlzdC5hJGNvdW50cykpKSoxMDAsKGhpc3QuYiRjb3VudHMvKHN1bShoaXN0LmIkY291bnRzKSkpKjEwMCkKCmZyID0gYmFycGxvdChmZywgYmVzaWRlPVRSVUUseGxhYj0iUmF0ZS1vZi1TcHJlYWQgKGttL2RheSkiLHlsYWI9Ik51bWJlciBvZiBmaXJlIGRheXMiLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpheGlzKDEsYXQ9YygwLjUsMy41LDYuNSw5LjUsMTIuNSwxNS41LDE4LjUsMjEuNSwyNC41LDI3LjUpLGxhYmVscz1oaXN0LmEkYnJlYWtzLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQoKZnIgPSBiYXJwbG90KGRlbnMsIGJlc2lkZT1UUlVFLHhsYWI9IlJhdGUtb2YtU3ByZWFkIChrbS9kYXkpIix5bGFiPSIlIGZpcmUgZGF5cyIsY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCmF4aXMoMSxhdD1jKDAuNSwzLjUsNi41LDkuNSwxMi41LDE1LjUsMTguNSwyMS41LDI0LjUsMjcuNSksbGFiZWxzPWhpc3QuYSRicmVha3MsY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCgp0aWZmKCIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL1M0X2ZyZXFfYXV0dW1uX21lZF92MS50aWYiLCB3aWR0aCA9IDYsIGhlaWdodCA9IDUsIHVuaXRzID0gJ2luJywgcmVzID0gMzAwKQpmciA9IGJhcnBsb3QoZGVucywgYmVzaWRlPVRSVUUseGxhYj1leHByZXNzaW9uKCdSYXRlLW9mLVNwcmVhZCAoa20gZCdeLTEqJyknKSx5bGFiPSIlIGZpcmUgZGF5cyIseWxpbT1jKDAsMjUpLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpheGlzKDEsYXQ9YygwLjUsMy41LDYuNSw5LjUsMTIuNSwxNS41LDE4LjUsMjEuNSwyNC41LDI3LjUpLGxhYmVscz1oaXN0LmEkYnJlYWtzLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQpkZXYub2ZmKCkgCgoKIyMjIyMjIyMjIyMjIHN1bW1lciBub3J0aGVybiBjYWxpZm9ybmlhCm91dDEgPSBzdWJzZXQocmVzLGNhdXNlID09IDEgJiAoZWNvMSA9PSA2IHwgZWNvMSA9PSA3KSAmIChtb250aCA+IDUgJiBtb250aDwxMCkpICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCm91dDIgPSBzdWJzZXQocmVzLGNhdXNlICE9MSAmIGNhdXNlICE9IDE0ICYgKGVjbzEgPT0gNiB8IGVjbzEgPT0gNykgJiAobW9udGggPiA1ICYgbW9udGg8MTApKQoKaGlzdC5hID1oaXN0KG91dDEkcm9zX2ttLGJyZWFrcyA9YygwLDAuNSwxLDIsMyw1LDcsMTAsMjAsMzApLHBsb3Q9RikKaGlzdC5iID1oaXN0KG91dDIkcm9zX2ttLGJyZWFrcyA9YygwLDAuNSwxLDIsMyw1LDcsMTAsMjAsMzApLHBsb3Q9RikKZmcgPSByYmluZChoaXN0LmEkY291bnRzLGhpc3QuYiRjb3VudHMpCmRlbnMgPSByYmluZCgoaGlzdC5hJGNvdW50cy8oc3VtKGhpc3QuYSRjb3VudHMpKSkqMTAwLChoaXN0LmIkY291bnRzLyhzdW0oaGlzdC5iJGNvdW50cykpKSoxMDApCgpmciA9IGJhcnBsb3QoZmcsIGJlc2lkZT1UUlVFLHhsYWI9IlJhdGUtb2YtU3ByZWFkIChrbS9kYXkpIix5bGFiPSJOdW1iZXIgb2YgZmlyZSBkYXlzIixjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKYXhpcygxLGF0PWMoMC41LDMuNSw2LjUsOS41LDEyLjUsMTUuNSwxOC41LDIxLjUsMjQuNSwyNy41KSxsYWJlbHM9aGlzdC5hJGJyZWFrcyxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKCmZyID0gYmFycGxvdChkZW5zLCBiZXNpZGU9VFJVRSx4bGFiPSJSYXRlLW9mLVNwcmVhZCAoa20vZGF5KSIseWxhYj0iJSBmaXJlIGRheXMiLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpheGlzKDEsYXQ9YygwLjUsMy41LDYuNSw5LjUsMTIuNSwxNS41LDE4LjUsMjEuNSwyNC41LDI3LjUpLGxhYmVscz1oaXN0LmEkYnJlYWtzLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQoKdGlmZigiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9TNF9mcmVxX3N1bW1lcl9ub3J0aF92MS50aWYiLCB3aWR0aCA9IDYsIGhlaWdodCA9IDUsIHVuaXRzID0gJ2luJywgcmVzID0gMzAwKQpmciA9IGJhcnBsb3QoZGVucywgYmVzaWRlPVRSVUUseGxhYj1leHByZXNzaW9uKCdSYXRlLW9mLVNwcmVhZCAoa20gZCdeLTEqJyknKSx5bGFiPSIlIGZpcmUgZGF5cyIseWxpbT1jKDAsNjApLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpheGlzKDEsYXQ9YygwLjUsMy41LDYuNSw5LjUsMTIuNSwxNS41LDE4LjUsMjEuNSwyNC41LDI3LjUpLGxhYmVscz1oaXN0LmEkYnJlYWtzLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQpkZXYub2ZmKCkgCgoKIyMjIyMjIyMjIyMjIHN1bW1lciBtZWRpdGVyZWFuIGNhbGlmb3JuaWEKb3V0MSA9IHN1YnNldChyZXMsY2F1c2UgPT0gMSAmIGVjbzEgPT0gMTEgICYgKG1vbnRoID4gNSAmIG1vbnRoPDEwKSkgICAjMT1saWdodG5pbmc7IDE0PXVua25vd247IDc9YXJzb24Kb3V0MiA9IHN1YnNldChyZXMsY2F1c2UgIT0xICYgY2F1c2UgIT0gMTQgJiBlY28xID09IDExICAmIChtb250aCA+IDUgJiBtb250aDwxMCkpCgpoaXN0LmEgPWhpc3Qob3V0MSRyb3Nfa20sYnJlYWtzID1jKDAsMC41LDEsMiwzLDUsNywxMCwyMCwzMCkscGxvdD1GKQpoaXN0LmIgPWhpc3Qob3V0MiRyb3Nfa20sYnJlYWtzID1jKDAsMC41LDEsMiwzLDUsNywxMCwyMCwzMCkscGxvdD1GKQpmZyA9IHJiaW5kKGhpc3QuYSRjb3VudHMsaGlzdC5iJGNvdW50cykKZGVucyA9IHJiaW5kKChoaXN0LmEkY291bnRzLyhzdW0oaGlzdC5hJGNvdW50cykpKSoxMDAsKGhpc3QuYiRjb3VudHMvKHN1bShoaXN0LmIkY291bnRzKSkpKjEwMCkKCmZyID0gYmFycGxvdChmZywgYmVzaWRlPVRSVUUseGxhYj0iUmF0ZS1vZi1TcHJlYWQgKGttL2RheSkiLHlsYWI9Ik51bWJlciBvZiBmaXJlIGRheXMiLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpheGlzKDEsYXQ9YygwLjUsMy41LDYuNSw5LjUsMTIuNSwxNS41LDE4LjUsMjEuNSwyNC41LDI3LjUpLGxhYmVscz1oaXN0LmEkYnJlYWtzLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQoKZnIgPSBiYXJwbG90KGRlbnMsIGJlc2lkZT1UUlVFLHhsYWI9IlJhdGUtb2YtU3ByZWFkIChrbS9kYXkpIix5bGFiPSIlIGZpcmUgZGF5cyIsY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCmF4aXMoMSxhdD1jKDAuNSwzLjUsNi41LDkuNSwxMi41LDE1LjUsMTguNSwyMS41LDI0LjUsMjcuNSksbGFiZWxzPWhpc3QuYSRicmVha3MsY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCgp0aWZmKCIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL1M0X2ZyZXFfc3VtbWVyX21lZF92MS50aWYiLCB3aWR0aCA9IDYsIGhlaWdodCA9IDUsIHVuaXRzID0gJ2luJywgcmVzID0gMzAwKQpmciA9IGJhcnBsb3QoZGVucywgYmVzaWRlPVRSVUUseGxhYj1leHByZXNzaW9uKCdSYXRlLW9mLVNwcmVhZCAoa20gZCdeLTEqJyknKSx5bGFiPSIlIGZpcmUgZGF5cyIsY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCmF4aXMoMSxhdD1jKDAuNSwzLjUsNi41LDkuNSwxMi41LDE1LjUsMTguNSwyMS41LDI0LjUsMjcuNSksbGFiZWxzPWhpc3QuYSRicmVha3MsY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCmRldi5vZmYoKSAKCgpgYGAKCiMjIyMjIyMjIyMjIyMjIyMjIDIwIGZhc3Rlc3QgZmlyZXMgICMjIyMjIyMjIyMjIyMKYGBge3J9CgpyZXMxID0gcmVzW3JlcyRyb3Nfa20gPiAxMCAmICFpcy5uYShyZXMkcm9zX2ttKSxdCmxlbmd0aChyZXMxJHJvc19rbSkKcmVzMQpgYGAKCgojIyMjIyMjIyMjIyMgYXJlIFJPUyB0aGUgc2FtZSBmb3IgbGlnaHQgJiBodW1hbiB1bmRlciB0aGUgc2FtZSBjb25kaXRpb25zCgpgYGB7cn0Kb3V0MSA9IHN1YnNldChyZXMsY2F1c2UgPT0gMSApICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCm91dDIgPSBzdWJzZXQocmVzLGNhdXNlICE9MSAmIGNhdXNlICE9IDE0ICkKCnBsb3Qob3V0MSR2cGQsbG9nKG91dDEkcm9zX2ttKSkKcG9pbnRzKG91dDIkdnBkLGxvZyhvdXQyJHJvc19rbSksY29sPSJyZWQiKQoKc3VtbWFyeShsbShvdXQxJHZwZH5sb2cob3V0MSRyb3Nfa20rMSksbmEub21pdD1UKSkKc3VtbWFyeShsbShvdXQyJHZwZH5sb2cob3V0MiRyb3Nfa20rMSkpKQoKYGBgCgoKCgojIyMjIyMjIyMjIyMjIyBhbmFseXNpcyBvZiB0aGUgZmlyc3QgZGF5ICMjIyMjIyMjIyMjIyMjIyMjCgpsb2FkIGRhdGEKYGBge3J9CgpkYWlseV9yZXM9cmVhZC50YWJsZSgiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvcHJvamVjdHMvVklJUlNfcm9zL2FsbF9pZ25pdGlvbnNfVjMudHh0IixoZWFkZXI9VCkKCnJlcz1hcy5kYXRhLmZyYW1lKGRhaWx5X3JlcykKCnJlcyRiaSA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJGJpKSkKcmVzJGVyYyA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJGVyYykpCnJlcyRldHIgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRldHIpKQpyZXMkZm0xMDAgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRmbTEwMCkpCnJlcyRmbTEwMDAgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRmbTEwMDApKQpyZXMkcGV0ID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkcGV0KSkKcmVzJHByID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkcHIpKQpyZXMkcm1heCA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJHJtYXgpKQpyZXMkcm1pbiA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJHJtaW4pKQpyZXMkdGggPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyR0aCkpCnJlcyR0bW1uID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkdG1tbikpCnJlcyR0bW14ID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkdG1teCkpCnJlcyR2cGQgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyR2cGQpKQpyZXMkd3MgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyR3cykpCnJlcyR2cyA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJHZzKSkKcmVzJHRvdGFsX2FyZWEgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyR0b3RhbF9hcmVhKSkKcmVzJG1heF9sYW5kID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkbWF4X2xhbmQpKQpyZXMkbWVhbl9sYW5kID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkbWVhbl9sYW5kKSkKCnJlcyRiaW9tYXNzID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkYmlvbWFzcykpCgpyZXMgPSByZXNbLTEsXQpyZXMkaHVtYW5bcmVzJGNhdXNlID09MV0gPTEKcmVzJGh1bWFuW3JlcyRjYXVzZSAhPTEgJiByZXMkY2F1c2UgIT0xNF0gPTAKCmBgYAoKYW5hbHlzaXMKCmBgYHtyfQoKb3V0MSA9IHJlc1tyZXMkY2F1c2UgIT0xICYgcmVzJGNhdXNlICE9IDE0LF0gCm91dDIgPSByZXNbcmVzJGNhdXNlID09MSxdIAoKb3V0MSA9IHN1YnNldChyZXMsKGVjbzEgPT0gNiB8ZWNvMSA9PSA3KSAmIHJlcyRjYXVzZSAhPTEgJiByZXMkY2F1c2UgIT0gMTQpICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCm91dDIgPSBzdWJzZXQocmVzLChlY28xID09IDYgfGVjbzEgPT0gNykgJiByZXMkY2F1c2UgPT0xKSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgoKb3V0MSA9IHN1YnNldChyZXMsZWNvMSA9PSAxMSYgcmVzJGNhdXNlICE9MSAmIHJlcyRjYXVzZSAhPSAxNCkKb3V0MiA9IHN1YnNldChyZXMsZWNvMSA9PSAxMSAmIHJlcyRjYXVzZSA9PTEpCgpvdXQxID0gc3Vic2V0KHJlcywoZWNvMSA9PSA2IHxlY28xID09IDcpICYgcmVzJGNhdXNlICE9MSAmIHJlcyRjYXVzZSAhPSAxNCAmIHJlcyRtb250ID4gNSAmIHJlcyRtb250IDwgMTAgKSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgpvdXQyID0gc3Vic2V0KHJlcywoZWNvMSA9PSA2IHxlY28xID09IDcpICYgcmVzJGNhdXNlID09MSYgcmVzJG1vbnQgPiA1ICYgcmVzJG1vbnQgPCAxMCkgICAjMT1saWdodG5pbmc7IDE0PXVua25vd247IDc9YXJzb24KCnQudGVzdChvdXQxJGJpLG91dDIkYmkpCnQudGVzdChvdXQxJGVyYyxvdXQyJGVyYykKdC50ZXN0KG91dDEkZXRyLG91dDIkZXRyKQp0LnRlc3Qob3V0MSRmbTEwMCxvdXQyJGZtMTAwKQp0LnRlc3Qob3V0MSRmbTEwMDAsb3V0MiRmbTEwMDApCnQudGVzdChvdXQxJHBldCxvdXQyJHBldCkKdC50ZXN0KG91dDEkcHIsb3V0MiRwcikKdC50ZXN0KG91dDEkcm1heCxvdXQyJHJtYXgpCnQudGVzdChvdXQxJHJtaW4sb3V0MiRybWluKQp0LnRlc3Qob3V0MSR0aCxvdXQyJHRoKQp0LnRlc3Qob3V0MSR0bW1uLG91dDIkdG1tbikKdC50ZXN0KG91dDEkdG1teCxvdXQyJHRtbXgpCnQudGVzdChvdXQxJHZwZCxvdXQyJHZwZCkKdC50ZXN0KG91dDEkdnMsb3V0MiR2cykKdC50ZXN0KG91dDEkd3Msb3V0MiR3cykKdC50ZXN0KG91dDEkYmlvbWFzcyxvdXQyJGJpb21hc3MpCnQudGVzdChvdXQxJG1lYW5fbGFuZCxvdXQyJG1lYW5fbGFuZCkKdC50ZXN0KGxvZzEwKG91dDEkdG90YWxfYXJlYSksbG9nMTAob3V0MiR0b3RhbF9hcmVhKSkKCgoKYGBgCgpgYGB7cn0KCnRhID0gdGFibGUocmVzJGh1bWFuLHJlcyRtb250KQpwcyA9IGJhcnBsb3QodGEsIGJlc2lkZT1UUlVFLCB5bGFiPSJudW1iZXIgb2YgZmlyZXMiLHhwZD1ULHhsYWI9ICJtb250aCIsIHhheHQ9J24nLHlsaW09YygwLDMwMCksIGF4aXMubHR5PTEsY2V4LmxhYiA9IDEuNCxjZXguYXhpcyA9IDEuMiApCmF4aXMoMSxhdD1jKDIsNSw4LDExLDE0LDE3LDIwLDIzLDI2LDI5LDMyLDM1KSwgbGFiZWxzID1jKDE6MTIpLHhsaW09YygwLDM2KSx4cGQ9RiAsY2V4LmxhYiA9IDEuNCxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsYygiaHVtYW4iLCJsaWdodG5pbmciKSxmaWxsID0gYygiZ3JleSIsICJibGFjayIpLCBidHk9Im4iLGNleD0xLjQpCnRleHQoMSwyODUsImEpIixjZXg9MS44KQpvdXQxID0gc3Vic2V0KHJlcyxlY28xID09IDYgfGVjbzEgPT0gNykgICAjMT1saWdodG5pbmc7IDE0PXVua25vd247IDc9YXJzb24Kb3V0MiA9IHN1YnNldChyZXMsZWNvMSA9PSAxMSkKCnRhID0gdGFibGUob3V0MSRodW1hbixvdXQxJG1vbnQpCnBzID0gYmFycGxvdCh0YSwgYmVzaWRlPVRSVUUsIHlsYWI9Im51bWJlciBvZiBmaXJlcyIseHBkPVQsIHhheHQ9J24nLHhsYWI9ICJtb250aCIsIHlsaW09YygwLDIwMCksIGF4aXMubHR5PTEsY2V4LmxhYiA9IDEuNCxjZXguYXhpcyA9IDEuMiApCmF4aXMoMSxhdD1jKDIsNSw4LDExLDE0LDE3LDIwLDIzLDI2LDI5LDMyLDM1KSwgbGFiZWxzID1jKDE6MTIpLHhsaW09YygwLDM2KSx4cGQ9RixjZXgubGFiID0gMS40LGNleC5heGlzID0gMS4zICkKbGVnZW5kKCJ0b3ByaWdodCIsYygiaHVtYW4iLCJsaWdodG5pbmciKSxmaWxsID0gYygiZ3JleSIsICJibGFjayIpLCBidHk9Im4iLGNleD0xLjQpCnRleHQoMSwxOTAsImIpIixjZXg9MS44KQoKdGEgPSB0YWJsZShvdXQyJGh1bWFuLG91dDIkbW9udCkKcHMgPSBiYXJwbG90KHRhLCBiZXNpZGU9VFJVRSwgeWxhYj0ibnVtYmVyIG9mIGZpcmVzIix4cGQ9VCx4YXh0PSduJyx4bGFiPSAibW9udGgiLCB5bGltPWMoMCwyMDApLCBheGlzLmx0eT0xLGNleC5sYWIgPSAxLjQsY2V4LmF4aXMgPSAxLjIgKQpheGlzKDEsYXQ9YygyLDUsOCwxMSwxNCwxNywyMCwyMywyNiwyOSwzMiwzNSksIGxhYmVscyA9YygxOjEyKSx4bGltPWMoMCwzNikseHBkPUYsY2V4LmxhYiA9IDEuNCxjZXguYXhpcyA9IDEuMyApCmxlZ2VuZCgidG9wcmlnaHQiLGMoImh1bWFuIiwibGlnaHRuaW5nIiksZmlsbCA9IGMoImdyZXkiLCAiYmxhY2siKSwgYnR5PSJuIixjZXg9MS40KQp0ZXh0KDEsMTkwLCJjKSIsY2V4PTEuOCkKYGBgCgoKCgpgYGB7cn0KZGF0YV9zPXJlYWQudGFibGUoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL3Byb2plY3RzL1ZJSVJTX3Jvcy9kYWlseV9tZWFuX3Jvc19kTkJSX1Y2LnR4dCIscm93Lm5hbWVzPU5VTEwpCnJvd25hbWVzKGRhdGFfcykgPC0gYygpCgpkYXRhX3MxID0gYXMuZGF0YS5mcmFtZShkYXRhX3NbLDI6MTldKQoKCm5hbWVzKGRhdGFfczEpID0gYygibG9uIiwibGF0IiwiZmlyZSIsIm5yX2RheSIsIm1heF9sYW5kIiwibWVhbl9sYW5kIiwiZWxldmF0aW9uIiwiYmlvbWFzcyIsIm1lYW5fcm9zIiwicm9zOTUiLCJtZWFuX2RuYnIiLCJkbmJyOTUiLCJtZWFuX3JkbmJyIiwicmRuYnI5NSIsIm1lYW5fQkFfcmVkIiwiQkFfcmVkOTUiLCJjYXVzZSIsInNpemUiKQpsZW5ndGgoZGF0YV9zMSRsb24pCmRhdGFfczEkbWVhbl9yb3MgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdGFfczEkbWVhbl9yb3MpKQpkYXRhX3MxJHJvczk1ID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihkYXRhX3MxJHJvczk1KSkKZGF0YV9zMSRtZWFuX2RuYnIgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdGFfczEkbWVhbl9kbmJyKSkKZGF0YV9zMSRkbmJyOTUgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdGFfczEkZG5icjk1KSkKZGF0YV9zMSRtZWFuX3JkbmJyID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihkYXRhX3MxJG1lYW5fcmRuYnIpKQpkYXRhX3MxJHJkbmJyOTUgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdGFfczEkcmRuYnI5NSkpCmRhdGFfczEkbG9uID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihkYXRhX3MxJGxvbikpCmRhdGFfczEkbGF0ID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihkYXRhX3MxJGxhdCkpCgpkYXRhX3MxJG1lYW5fbGFuZFtpcy5uYShkYXRhX3MxJG1lYW5fbGFuZCldPWRhdGFfczEkbWF4X2xhbmRbaXMubmEoZGF0YV9zMSRtZWFuX2xhbmQpXSAjbWVhbiBsYW5kY292ZXIgZ2l2ZXMgTkEgd2hlbiBvbmx5IG9uZSBsYW5kY292ZXIgaXMgcHJlc2VudApkYXRhX3MxJG1lYW5fbGFuZCA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGF0YV9zMSRtZWFuX2xhbmQpKQpkYXRhX3MxJG1lYW5fQkFfcmVkID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihkYXRhX3MxJG1lYW5fQkFfcmVkKSkKZGF0YV9zMSRCQV9yZWQ5NSA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGF0YV9zMSRCQV9yZWQ5NSkpCmRhdGFfczEkYmlvbWFzcyA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGF0YV9zMSRiaW9tYXNzKSkKZGF0YV9zMSRlbGV2YXRpb24gPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdGFfczEkZWxldmF0aW9uKSkKZGF0YV9zMSRjYXVzZSA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGF0YV9zMSRjYXVzZSkpCmRhdGFfczEkc2l6ZSA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGF0YV9zMSRzaXplKSkKCmRhdGFfczE9bmEub21pdChkYXRhX3MxKQoKc2hhcGUgPSBzaGFwZWZpbGUoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL2RhdGEvdmVnX2NhbGlmb3JuaWEvY2FfZWNvX2wzL2NhX2Vjb19sMy5zaHAiKQpwdHMgPC0gU3BhdGlhbFBvaW50cyhkYXRhX3MxWyxjKCJsb24iLCJsYXQiKV0sUDRTLmxhdGxvbikKc2hhcGUgPSBzcFRyYW5zZm9ybShzaGFwZSxQNFMubGF0bG9uKQplY28gPSBvdmVyKHB0cywgc2hhcGUpCmRhdGFfczEkTDFDT0RFID0gZWNvJE5BX0wxQ09ERQpkYXRhX3MxJEwzbmFtZSA9IGVjbyRVU19MM05BTUUKZGF0YV9zMSRMMUNPREUgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdGFfczEkTDFDT0RFKSkKCiNkYXRhX3MxJGxvZ19yb3MgPSBsb2cxMChkYXRhX3MxJG1lYW5fcm9zKQojZGF0YV9zMSRsb2dfcm9zOTUgPSBsb2cxMChkYXRhX3MxJHJvczk1KQojZGF0YV9zMSA9IGRhdGFfczFbZGF0YV9zMSRtZWFuX3JvcyA+MCxdCmRhdGFfczEkaHVtYW5bZGF0YV9zMSRjYXVzZSAhPTEgJiBkYXRhX3MxJGNhdXNlICE9MTQgJiBkYXRhX3MxJGNhdXNlICE9MTddPTEKZGF0YV9zMSRodW1hbltkYXRhX3MxJGNhdXNlID09MSBdPTIKCmRhdGFfczEkcm9zX2ttID0gKGRhdGFfczEkcm9zOTUgKjI0KS8xMDAwCmRhdGFfdGVzdCA9IGRhdGFfczFbZGF0YV9zMSRtYXhfbGFuZCA9PSAxLF0KZGF0YV90ZXN0MSA9IGRhdGFfczFbZGF0YV9zMSRMMUNPREUgPT0gNiB8ZGF0YV9zMSRMMUNPREUgPT0gNyAsXQpkYXRhX3Rlc3QyID0gZGF0YV9zMVtkYXRhX3MxJEwxQ09ERSA9PSAxMSxdCgpkYXRhX3Rlc3QxID0gZGF0YV9zMVtkYXRhX3MxJGh1bWFuID09IDEgJiAoZGF0YV9zMSRMMUNPREUgPT0gNiB8ZGF0YV9zMSRMMUNPREUgPT0gNyksXQpkYXRhX3Rlc3QyID0gZGF0YV9zMVtkYXRhX3MxJGh1bWFuID09IDIgJiAoZGF0YV9zMSRMMUNPREUgPT0gNiB8ZGF0YV9zMSRMMUNPREUgPT0gNyksXQoKZGF0YV90ZXN0MSA9IGRhdGFfczFbZGF0YV9zMSRodW1hbiA9PSAxICxdCmRhdGFfdGVzdDIgPSBkYXRhX3MxW2RhdGFfczEkaHVtYW4gPT0gMiAsXQoKZGF0YV90ZXN0MT1uYS5vbWl0KGRhdGFfdGVzdDEpCmRhdGFfdGVzdDI9bmEub21pdChkYXRhX3Rlc3QyKQoKcGxvdChkYXRhX3MxJHJvc19rbSwgZGF0YV9zMSRtZWFuX0JBX3JlZCxsb2c9IngiLHhsYWI9IlJhdGUtb2YtU3ByZWFkIChrbS9kYXkpIix5bGFiPSJUcmVlIG1vcnRhbGl0eSAoJSkiLHhsaW09YygwLjAwNSwzMCkseGF4dD0ibiIsY2V4LmF4aXM9MS40ICxjZXgubGFiPTEuNCxjZXg9MC44LCBjb2w9ImJsYWNrIikKYXhpcygxLGF0PW1hcmtzLGxhYmVscz1tYXJrcyxjZXguYXhpcz0xLjQgKQpwb2ludHMoZGF0YV90ZXN0MiRyb3Nfa20sIGRhdGFfdGVzdDIkbWVhbl9CQV9yZWQsY2V4PTAuOCwgY29sPSJkYXJrZ3JleSIpCnBvaW50cyhkYXRhX3Rlc3QxJHJvc19rbSwgZGF0YV90ZXN0MSRtZWFuX0JBX3JlZCxjZXg9MC44LCBjb2w9Im9yYW5nZSIpCgoKbWFya3M9YygwLjAxLDAuMSwxLDEwKQp0aWZmKCIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL2ZpZ19iYXNhX3Jvc19hbGxfdjMudGlmIiwgd2lkdGggPSA1LCBoZWlnaHQgPSA1LCB1bml0cyA9ICdpbicsIHJlcyA9IDMwMCkKcGxvdChkYXRhX3MxJHJvc19rbSwgZGF0YV9zMSRtZWFuX0JBX3JlZCxsb2c9IngiLHhsYWI9IlJhdGUtb2YtU3ByZWFkIChrbS9kYXkpIix5bGFiPSJUcmVlIG1vcnRhbGl0eSAoJSkiLHhsaW09YygwLjAwNSwzMCkseGF4dD0ibiIsY2V4LmF4aXM9MS40ICxjZXgubGFiPTEuNCxjZXg9MC44LCBjb2w9ImJsYWNrIikKYXhpcygxLGF0PW1hcmtzLGxhYmVscz1tYXJrcyxjZXguYXhpcz0xLjQgKQpwb2ludHMoZGF0YV90ZXN0MiRyb3Nfa20sIGRhdGFfdGVzdDIkbWVhbl9CQV9yZWQsY2V4PTAuOCwgY29sPSJkYXJrZ3JleSIpCnBvaW50cyhkYXRhX3Rlc3QxJHJvc19rbSwgZGF0YV90ZXN0MSRtZWFuX0JBX3JlZCxjZXg9MC44LCBjb2w9Im9yYW5nZSIpCmxpbmVzKGxvd2VzcyhkYXRhX3MxJHJvc19rbSwgZGF0YV9zMSRtZWFuX0JBX3JlZCwgZj0wLjQxKSxjb2w9ImJsYWNrIiwgbHdkPTMpCmxpbmVzKGxvd2VzcyhkYXRhX3Rlc3QxJHJvc19rbSwgZGF0YV90ZXN0MSRtZWFuX0JBX3JlZCwgZj0wLjQxKSxjb2w9ImRhcmtnb2xkZW5yb2QzIiwgbHdkPTMpCmxpbmVzKGxvd2VzcyhkYXRhX3Rlc3QyJHJvc19rbSwgZGF0YV90ZXN0MiRtZWFuX0JBX3JlZCwgZj0wLjQxKSxjb2w9ImdyYXk0MCIsIGx3ZD0zKQpsZWdlbmQoInRvcGxlZnQiLGxlZ2VuZD1jKCJhbGwiLCJodW1hbiIsImxpZ2h0bmluZyIpLGNvbCA9IGMoImJsYWNrIiwiZGFya2dvbGRlbnJvZDMiLCAiZ3JheTQwIiksbHR5PTEsIGJ0eT0ibiIsbHdkID0gMywgY2V4PTEpCmRldi5vZmYoKQoKCgpkYXRhX3Rlc3QxID0gZGF0YV9zMVtkYXRhX3MxJGh1bWFuID09IDEgJiBkYXRhX3MxJG1heF9sYW5kIDwxLjUsXQpkYXRhX3Rlc3QyID0gZGF0YV9zMVtkYXRhX3MxJGh1bWFuID09IDIgJiBkYXRhX3MxJG1heF9sYW5kIDwxLjUsXQpkYXRhX2ZvcmVzdCA9IGRhdGFfczFbZGF0YV9zMSRtYXhfbGFuZCA8MS41LF0KZGF0YV90ZXN0MT1uYS5vbWl0KGRhdGFfdGVzdDEpCmRhdGFfdGVzdDI9bmEub21pdChkYXRhX3Rlc3QyKQoKZGF0YV9zMiA9IGRhdGFfczFbZGF0YV9zMSRyb3Nfa20gPDEwLF0KZGF0YV9mb3Jlc3RfMTAgPSBkYXRhX3MyW2RhdGFfczIkbWF4X2xhbmQgPDEuNSxdCmRhdGFfdGVzdDFfMTAgPSBkYXRhX3MyW2RhdGFfczIkaHVtYW4gPT0gMSAmIGRhdGFfczIkbWF4X2xhbmQgPDEuNSxdCmRhdGFfdGVzdDJfMTAgPSBkYXRhX3MyW2RhdGFfczIkaHVtYW4gPT0gMiAmIGRhdGFfczIkbWF4X2xhbmQgPDEuNSxdCmRhdGFfdGVzdDFfMTA9bmEub21pdChkYXRhX3Rlc3QxXzEwKQpkYXRhX3Rlc3QyXzEwPW5hLm9taXQoZGF0YV90ZXN0Ml8xMCkKCm1hcmtzPWMoMC4wMSwwLjEsMSwxMCkKdGlmZigiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9maWdfYmFzYV9yb3NfZm9yZXN0X3YzLnRpZiIsIHdpZHRoID0gNSwgaGVpZ2h0ID0gNSwgdW5pdHMgPSAnaW4nLCByZXMgPSAzMDApCnBsb3QoZGF0YV9mb3Jlc3Qkcm9zX2ttLCBkYXRhX2ZvcmVzdCRtZWFuX0JBX3JlZCxsb2c9IngiLHhsYWI9IlJhdGUtb2YtU3ByZWFkIChrbS9kYXkpIix5bGFiPSJUcmVlIG1vcnRhbGl0eSAoJSkiLHhsaW09YygwLjAwNSwzMCkseGF4dD0ibiIsY2V4LmF4aXM9MS40ICxjZXgubGFiPTEuNCxjZXg9MC44LCBjb2w9ImJsYWNrIikKYXhpcygxLGF0PW1hcmtzLGxhYmVscz1tYXJrcyxjZXguYXhpcz0xLjQgKQpwb2ludHMoZGF0YV90ZXN0MiRyb3Nfa20sIGRhdGFfdGVzdDIkbWVhbl9CQV9yZWQsY2V4PTAuOCwgY29sPSJkYXJrZ3JleSIpCnBvaW50cyhkYXRhX3Rlc3QxJHJvc19rbSwgZGF0YV90ZXN0MSRtZWFuX0JBX3JlZCxjZXg9MC44LCBjb2w9Im9yYW5nZSIpCmxpbmVzKGxvd2VzcyhkYXRhX2ZvcmVzdF8xMCRyb3Nfa20sIGRhdGFfZm9yZXN0XzEwJG1lYW5fQkFfcmVkLCBmPTAuNDEpLGNvbD0iYmxhY2siLCBsd2Q9MykKbGluZXMobG93ZXNzKGRhdGFfdGVzdDFfMTAkcm9zX2ttLCBkYXRhX3Rlc3QxXzEwJG1lYW5fQkFfcmVkLCBmPTAuNDEpLGNvbD0iZGFya2dvbGRlbnJvZDMiLCBsd2Q9MykKbGluZXMobG93ZXNzKGRhdGFfdGVzdDJfMTAkcm9zX2ttLCBkYXRhX3Rlc3QyXzEwJG1lYW5fQkFfcmVkLCBmPTAuNDEpLGNvbD0iZ3JheTQwIiwgbHdkPTMpCmxlZ2VuZCgidG9wbGVmdCIsbGVnZW5kPWMoImFsbCIsImh1bWFuIiwibGlnaHRuaW5nIiksY29sID0gYygiYmxhY2siLCJkYXJrZ29sZGVucm9kMyIsICJncmF5NDAiKSxsdHk9MSwgYnR5PSJuIixsd2QgPSAzLCBjZXg9MSkKZGV2Lm9mZigpCgptYXJrcz1jKDAuMDEsMC4xLDEsMTApCnRpZmYoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3MvZmlnX2Jhc2Ffcm9zX2ZvcmVzdF92NC50aWYiLCB3aWR0aCA9IDUsIGhlaWdodCA9IDUsIHVuaXRzID0gJ2luJywgcmVzID0gMzAwKQpwbG90KGRhdGFfZm9yZXN0JHJvc19rbSwgZGF0YV9mb3Jlc3QkbWVhbl9CQV9yZWQsbG9nPSJ4Iix4bGFiPSJSYXRlLW9mLVNwcmVhZCAoa20vZGF5KSIseWxhYj0iVHJlZSBtb3J0YWxpdHkgKCUpIix4bGltPWMoMC4xLDE1KSx4YXh0PSJuIixjZXguYXhpcz0xLjQgLGNleC5sYWI9MS40LGNleD0wLjgsIGNvbD0iYmxhY2siKQpheGlzKDEsYXQ9bWFya3MsbGFiZWxzPW1hcmtzLGNleC5heGlzPTEuNCApCnBvaW50cyhkYXRhX3Rlc3QyJHJvc19rbSwgZGF0YV90ZXN0MiRtZWFuX0JBX3JlZCxjZXg9MC44LCBjb2w9ImRhcmtncmV5IikKcG9pbnRzKGRhdGFfdGVzdDEkcm9zX2ttLCBkYXRhX3Rlc3QxJG1lYW5fQkFfcmVkLGNleD0wLjgsIGNvbD0ib3JhbmdlIikKbGluZXMobG93ZXNzKGRhdGFfZm9yZXN0XzEwJHJvc19rbSwgZGF0YV9mb3Jlc3RfMTAkbWVhbl9CQV9yZWQsIGY9MC40MSksY29sPSJibGFjayIsIGx3ZD0zKQpsaW5lcyhsb3dlc3MoZGF0YV90ZXN0MV8xMCRyb3Nfa20sIGRhdGFfdGVzdDFfMTAkbWVhbl9CQV9yZWQsIGY9MC40MSksY29sPSJkYXJrZ29sZGVucm9kMyIsIGx3ZD0zKQpsaW5lcyhsb3dlc3MoZGF0YV90ZXN0Ml8xMCRyb3Nfa20sIGRhdGFfdGVzdDJfMTAkbWVhbl9CQV9yZWQsIGY9MC40MSksY29sPSJncmF5NDAiLCBsd2Q9MykKbGVnZW5kKCJ0b3BsZWZ0IixsZWdlbmQ9YygiYWxsIiwiaHVtYW4iLCJsaWdodG5pbmciKSxjb2wgPSBjKCJibGFjayIsImRhcmtnb2xkZW5yb2QzIiwgImdyYXk0MCIpLGx0eT0xLCBidHk9Im4iLGx3ZCA9IDMsIGNleD0xKQpkZXYub2ZmKCkKCgpwbG90KGRhdGFfZm9yZXN0JHJvc19rbSwgZGF0YV9mb3Jlc3QkbWVhbl9CQV9yZWQsbG9nPSJ4Iix4bGFiPSJSYXRlLW9mLVNwcmVhZCAoa20vZGF5KSIseWxhYj0iVHJlZSBtb3J0YWxpdHkgKCUpIix4bGltPWMoMC4xLDE1KSx4YXh0PSJuIixjZXguYXhpcz0xLjQgLGNleC5sYWI9MS40LGNleD0wLjgsIGNvbD0iYmxhY2siKQpheGlzKDEsYXQ9bWFya3MsbGFiZWxzPW1hcmtzLGNleC5heGlzPTEuNCApCnBvaW50cyhkYXRhX3Rlc3QyJHJvc19rbSwgZGF0YV90ZXN0MiRtZWFuX0JBX3JlZCxjZXg9MC44LCBjb2w9ImRhcmtncmV5IikKcG9pbnRzKGRhdGFfdGVzdDEkcm9zX2ttLCBkYXRhX3Rlc3QxJG1lYW5fQkFfcmVkLGNleD0wLjgsIGNvbD0ib3JhbmdlIikKbGluZXMobG93ZXNzKGRhdGFfZm9yZXN0XzEwJHJvc19rbSwgZGF0YV9mb3Jlc3RfMTAkbWVhbl9CQV9yZWQsIGY9MC40MSksY29sPSJibGFjayIsIGx3ZD0zKQpsaW5lcyhsb3dlc3MoZGF0YV90ZXN0MV8xMCRyb3Nfa20sIGRhdGFfdGVzdDFfMTAkbWVhbl9CQV9yZWQsIGY9MC40MSksY29sPSJkYXJrZ29sZGVucm9kMyIsIGx3ZD0zKQpsaW5lcyhsb3dlc3MoZGF0YV90ZXN0Ml8xMCRyb3Nfa20sIGRhdGFfdGVzdDJfMTAkbWVhbl9CQV9yZWQsIGY9MC40MSksY29sPSJncmF5NDAiLCBsd2Q9MykKbGVnZW5kKCJ0b3BsZWZ0IixsZWdlbmQ9YygiYWxsIiwiaHVtYW4iLCJsaWdodG5pbmciKSxjb2wgPSBjKCJibGFjayIsImRhcmtnb2xkZW5yb2QzIiwgImdyYXk0MCIpLGx0eT0xLCBidHk9Im4iLGx3ZCA9IDMsIGNleD0xKQoKCmBgYAoKCmBgYHtyfQoKZGF0YV90ZXN0ID0gZGF0YV9zMVtkYXRhX3MxJG1heF9sYW5kID09IDEsXQpkYXRhX3Rlc3QxID0gZGF0YV9zMVtkYXRhX3MxJEwxQ09ERSA9PSA2IHxkYXRhX3MxJEwxQ09ERSA9PSA3ICxdCmRhdGFfdGVzdDIgPSBkYXRhX3MxW2RhdGFfczEkTDFDT0RFID09IDExLF0KCmRhdGFfdGVzdDEgPSBkYXRhX3MxW2RhdGFfczEkaHVtYW4gPT0gMSAmIChkYXRhX3MxJEwxQ09ERSA9PSA2IHxkYXRhX3MxJEwxQ09ERSA9PSA3KSxdCmRhdGFfdGVzdDIgPSBkYXRhX3MxW2RhdGFfczEkaHVtYW4gPT0gMiAmIChkYXRhX3MxJEwxQ09ERSA9PSA2IHxkYXRhX3MxJEwxQ09ERSA9PSA3KSxdCgpkYXRhX3Rlc3QxID0gZGF0YV9zMVtkYXRhX3MxJGh1bWFuID09IDEgLF0KZGF0YV90ZXN0MiA9IGRhdGFfczFbZGF0YV9zMSRodW1hbiA9PSAyICxdCgoKZmFzdCA9IGRhdGFfczFbZGF0YV9zMSRyb3Nfa20gPiAxLF0KZmFzdF9odW0gPSBmYXN0W2Zhc3QkaHVtYW4gPT0gMSxdCgpzdW0oZmFzdCRzaXplKS9zdW0oZGF0YV9zMSRzaXplKQpsZW5ndGgoZmFzdCRzaXplKS9sZW5ndGgoZGF0YV9zMSRzaXplKQoKc3VtKGZhc3RfaHVtJHNpemUsIG5hLnJtPVQpL3N1bShmYXN0JHNpemUpCmxlbmd0aChmYXN0X2h1bSRzaXplKS9sZW5ndGgoZmFzdCRzaXplKQoKCnF1YW4gPSBxdWFudGlsZShkYXRhX3MxJHJvc19rbSwwLjUpCmZhc3QgPSBkYXRhX3MxW2RhdGFfczEkcm9zX2ttID4gcXVhbixdCnNsb3cgPSBkYXRhX3MxW2RhdGFfczEkcm9zX2ttIDwgcXVhbixdCmZhc3RfaHVtID0gZmFzdFtmYXN0JGh1bWFuID09IDEsXQoKc3VtKGZhc3Qkc2l6ZSkvc3VtKGRhdGFfczEkc2l6ZSkKbGVuZ3RoKGZhc3Qkc2l6ZSkvbGVuZ3RoKGRhdGFfczEkc2l6ZSkKc3VtKChkYXRhX3MxJG1lYW5fQkFfcmVkKmRhdGFfczEkc2l6ZSkpLyhzdW0oZGF0YV9zMSRzaXplKSkKbWVhbihkYXRhX3MxJG1lYW5fQkFfcmVkKQoKc3VtKGZhc3RfaHVtJHNpemUsIG5hLnJtPVQpL3N1bShmYXN0JHNpemUpCmxlbmd0aChmYXN0X2h1bSRzaXplKS9sZW5ndGgoZmFzdCRzaXplKQpzdW0oKGZhc3QkbWVhbl9CQV9yZWQqZmFzdCRzaXplKSkvKHN1bShmYXN0JHNpemUpKQptZWFuKGZhc3QkbWVhbl9CQV9yZWQpCnN1bSgoc2xvdyRtZWFuX0JBX3JlZCpzbG93JHNpemUpKS8oc3VtKHNsb3ckc2l6ZSkpCm1lYW4oc2xvdyRtZWFuX0JBX3JlZCkKCgpgYGAKCgoKCldoZW4geW91IHNhdmUgdGhlIG5vdGVib29rLCBhbiBIVE1MIGZpbGUgY29udGFpbmluZyB0aGUgY29kZSBhbmQgb3V0cHV0IHdpbGwgYmUgc2F2ZWQgYWxvbmdzaWRlIGl0IChjbGljayB0aGUgKlByZXZpZXcqIGJ1dHRvbiBvciBwcmVzcyAqQ21kK1NoaWZ0K0sqIHRvIHByZXZpZXcgdGhlIEhUTUwgZmlsZSkuIAoKVGhlIHByZXZpZXcgc2hvd3MgeW91IGEgcmVuZGVyZWQgSFRNTCBjb3B5IG9mIHRoZSBjb250ZW50cyBvZiB0aGUgZWRpdG9yLiBDb25zZXF1ZW50bHksIHVubGlrZSAqS25pdCosICpQcmV2aWV3KiBkb2VzIG5vdCBydW4gYW55IFIgY29kZSBjaHVua3MuIEluc3RlYWQsIHRoZSBvdXRwdXQgb2YgdGhlIGNodW5rIHdoZW4gaXQgd2FzIGxhc3QgcnVuIGluIHRoZSBlZGl0b3IgaXMgZGlzcGxheWVkLgoKCgpgYGAKCgoKCgoK